sncf-connect-tech / hesperides-jenkins-lib

Shared lib for Jenkins pipelines to interact with Hesperides
GNU General Public License v3.0
3 stars 13 forks source link

Bug de MAJ des propriétés itératives avec un path: - 400 Bad Request #12

Open cvilleret opened 6 years ago

cvilleret commented 6 years ago

Bonjour, lorsqu'on injecte les properties via la lib groovy, 3 comportements ont été vu sur les properties itératives : 1 - quand on push les properties avec un json du type :

{
  "houston-event-stream-api-jar": {
    "search.courses.responseMaxSize": "100"
  }
}

cela supprime les itérative, on est obligé de les indiquer a chaque json de diff de properties.

2 - quand on push les properties avec une notion de path :

{
  "path:#HCO#JAR#houston-connector-pao-jar": {
    "streams.ticket-mark.kafka.destination-topic": "ticket-marks-bom",
    "streams.ticket-mark.throttle.max-request-per-seconds": "20"
  }
}

Là il y a conservation des itératives, ce qui est un comportement plutot attendu.

3 - lorsqu'on tente de push des properties itérative avec la notion de path :

{
  "path:#HCO#JAR#houston-connector-pao-jar": {
    "streams.ticket-mark.accept-delay-days-to-midnight": "1",
    "iterable_properties": {
     "pao.kafka.consumer.kafka-clients.bootstraps.servers": [
        {
          "pao.kafka.consumer.kafka-clients.bootstrap.server.id": "int-2",
          "pao.kafka.consumer.kafka-clients.bootstrap.server.value": "localhost:50000"
        }
      ]
    }
  }
}

Là la lib groovy nous balance qu'il n'arrive pas a déserializer.

Pour le moment pour le pas pourrir les iterative je passe uniquement par le path.

Lucas-C commented 6 years ago

J'ai essayé de créer un cas de reproduction. Avec le code ci-dessous, j'ai l'erreur suivante:

{
    "message": "Can not deserialize instance of java.lang.String out of START_OBJECT token"
}

S'agit-il bien de ce que tu as observé ?

Le test:

import spock.lang.Shared
import spock.lang.Specification
import com.vsct.dt.hesperides.jenkins.pipelines.Hesperides
import com.vsct.dt.hesperides.jenkins.pipelines.http.HTTPBuilderRequester

class BugRepro extends Specification implements Helper {

    static final ENV = System.properties
    @Shared
    Hesperides hesperides = new Hesperides(apiRootUrl: "${ENV.HESPERIDES_HOST}:${ENV.HESPERIDES_PORT}",
                                           auth: ENV.HESPERIDES_AUTH,
                                           httpRequester: new HTTPBuilderRequester())
    static applicationName = 'PAO'
    static platformName = 'INT2'
    static moduleName = 'houston-connector-pao-jar'
    static logicGroupName = 'HCO'
    static subLogicGroup = 'JAR'
    static instanceName = 'DUMMY'
    static moduleVersion = '2.0.0.0'

    def setupSpec() {
        log "${ENV.HESPERIDES_AUTH}@${ENV.HESPERIDES_HOST}:${ENV.HESPERIDES_PORT}"
        hesperides.createPlatform(app: applicationName, platform: platformName, version: '1.0.0.0')
        hesperides.createModule(moduleName: moduleName, version: moduleVersion)
        hesperides.putModuleOnPlatform(app: applicationName,
                platform: platformName,
                moduleName: moduleName,
                moduleVersion: moduleVersion,
                isWorkingCopy: true,
                logicGroupPath: "#${logicGroupName}#${subLogicGroup}")
        hesperides.createInstance(app: applicationName, platform: platformName, moduleName: moduleName, instance: instanceName, path: "#${logicGroupName}#${subLogicGroup}")
    }

    def cleanupSpec() {
        hesperides.deletePlatform(app:applicationName, platform: platformName)
        hesperides.deleteModule(moduleName: moduleName, version: moduleVersion, moduleType: 'workingcopy')
    }

    def "Can update new properties"() {
        when:
            def jsonProperties = """
                {
                  "path:#HCO#JAR#houston-connector-pao-jar": {
                    "streams.ticket-mark.accept-delay-days-to-midnight": "1",
                    "iterable_properties": {
                     "pao.kafka.consumer.kafka-clients.bootstraps.servers": [
                        {
                          "pao.kafka.consumer.kafka-clients.bootstrap.server.id": "int-2",
                          "pao.kafka.consumer.kafka-clients.bootstrap.server.value": "localhost:50000"
                        }
                      ]
                    }
                  }
                }
                """

            File jsonFile = new File('jsonProperties')
            jsonFile.text = jsonProperties
            hesperides.updateProperties(app: applicationName,
                                        platform: platformName,
                                        jsonPropertyUpdates: jsonFile.path,
                                        commitMsg: 'hesperides-jenkins-lib Spock tests')
            jsonFile.delete()

            def modulePropertiesPath = "#${logicGroupName}#${subLogicGroup}#${moduleName}#${moduleVersion}#WORKINGCOPY"
            def platformProps = hesperides.getModulePropertiesForPlatform(app: applicationName, platform: platformName, modulePropertiesPath: modulePropertiesPath)
            def globalProps = hesperides.getModulePropertiesForPlatform(app: applicationName, platform: platformName, modulePropertiesPath: '#')
            def instanceProps = hesperides.getInstanceProperties(app: applicationName, platform: platformName, moduleName: moduleName, instance: instanceName)

        then:
            platformProps['iterable_properties'].size() > 0
            platformProps['iterable_properties'].find {
                it.name == 'pao.kafka.consumer.kafka-clients.bootstraps.servers'
            }
            platformProps['iterable_properties'].find {
                it.name == 'pao.kafka.consumer.kafka-clients.bootstraps.servers'
            }['iterable_valorisation_items'].size() > 0
            platformProps['iterable_properties'].find {
                it.name == 'pao.kafka.consumer.kafka-clients.bootstraps.servers'
            }['iterable_valorisation_items'][0]['values'].find {
                it.name == 'pao.kafka.consumer.kafka-clients.bootstrap.server.id'
            }['value'] == 'int-2'
    }

    def log(msg) {
        System.out.println msg
    }

}
Lucas-C commented 6 years ago

Gwendal J. a eu le même souci, voici un extrait des logs:

Response Code: HTTP/1.1 400 Bad Request
Success code from [100‥600]
[Pipeline] echo
[message:Can not deserialize instance of java.lang.String out of START_OBJECT token]
Lucas-C commented 6 years ago

Il a mis le doigt sur le bug je crois:

les iterables properties se retouvent dans iterable_properties à la racine et dans key_value_properties

Gwendal-J commented 6 years ago

Je prends le point aujourd'hui.