Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rancher-cli for openSUSE:Factory checked in at 2022-03-25 21:54:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rancher-cli (Old) and /work/SRC/openSUSE:Factory/.rancher-cli.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rancher-cli" Fri Mar 25 21:54:46 2022 rev:2 rq:964807 version:2.6.4 Changes: -------- --- /work/SRC/openSUSE:Factory/rancher-cli/rancher-cli.changes 2022-01-26 21:28:20.417431521 +0100 +++ /work/SRC/openSUSE:Factory/.rancher-cli.new.1900/rancher-cli.changes 2022-03-25 21:55:02.274299021 +0100 @@ -1,0 +2,8 @@ +Fri Mar 25 09:13:04 UTC 2022 - ka...@b1-systems.de + +- Update to version 2.6.4: + * Transform all keys to JSON format as specified by struct tags for RKE config values + * Add s390x arch support +- versions 2.6.1, 2.6.2 and 2.6.3 are not existing + +------------------------------------------------------------------- Old: ---- cli-2.6.0.tar.gz New: ---- cli-2.6.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rancher-cli.spec ++++++ --- /var/tmp/diff_new_pack.d5PXWf/_old 2022-03-25 21:55:03.354300048 +0100 +++ /var/tmp/diff_new_pack.d5PXWf/_new 2022-03-25 21:55:03.374300067 +0100 @@ -1,7 +1,7 @@ # # spec file for package rancher-cli # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: rancher-cli -Version: 2.6.0 +Version: 2.6.4 Release: 0 Summary: Rancher CLI License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.d5PXWf/_old 2022-03-25 21:55:03.414300106 +0100 +++ /var/tmp/diff_new_pack.d5PXWf/_new 2022-03-25 21:55:03.414300106 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/rancher/cli</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v2.6.0</param> + <param name="revision">v2.6.4</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> @@ -16,7 +16,7 @@ <param name="compression">gz</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">cli-2.6.0.tar.gz</param> + <param name="archive">cli-2.6.4.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.d5PXWf/_old 2022-03-25 21:55:03.438300128 +0100 +++ /var/tmp/diff_new_pack.d5PXWf/_new 2022-03-25 21:55:03.438300128 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/rancher/cli</param> - <param name="changesrevision">a9204188e36f850eb1407eb5cad884f0f6daf3ac</param></service></servicedata> + <param name="changesrevision">27cb4fdbd27167b8c06b0c6f3318c69fd555948f</param></service></servicedata> (No newline at EOF) ++++++ cli-2.6.0.tar.gz -> cli-2.6.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cli-2.6.0/cmd/cluster.go new/cli-2.6.4/cmd/cluster.go --- old/cli-2.6.0/cmd/cluster.go 2021-11-10 22:45:16.000000000 +0100 +++ new/cli-2.6.4/cmd/cluster.go 2022-02-18 21:28:45.000000000 +0100 @@ -250,6 +250,9 @@ if ctx.NArg() == 0 { return cli.ShowSubcommandHelp(ctx) } + if ctx.Bool("import") { + return clusterImport(ctx) + } c, err := GetClient(ctx) if err != nil { return err @@ -266,23 +269,12 @@ } } - rkeConfig, err := getRKEConfig(ctx) + config, err := getClusterConfig(ctx) if err != nil { return err } - clusterConfig := &managementClient.Cluster{ - Name: ctx.Args().First(), - Description: ctx.String("description"), - RancherKubernetesEngineConfig: rkeConfig, - } - - if ctx.String("psp-default-policy") != "" { - clusterConfig.DefaultPodSecurityPolicyTemplateID = ctx.String("psp-default-policy") - } - - createdCluster, err := c.ManagementClient.Cluster.Create(clusterConfig) - + createdCluster, err := c.ManagementClient.Cluster.Create(config) if err != nil { return err } @@ -752,48 +744,61 @@ return options } -func getRKEConfig(ctx *cli.Context) (*managementClient.RancherKubernetesEngineConfig, error) { - if ctx.Bool("import") { - return nil, nil +func getClusterConfig(ctx *cli.Context) (*managementClient.Cluster, error) { + config := managementClient.Cluster{ + RancherKubernetesEngineConfig: new(managementClient.RancherKubernetesEngineConfig), } - rkeConfig := &managementClient.RancherKubernetesEngineConfig{} - if ctx.String("rke-config") != "" { bytes, err := readFileReturnJSON(ctx.String("rke-config")) if err != nil { return nil, err } - bytes, err = fixTopLevelKeys(bytes) - if err != nil { + + var jsonObject map[string]interface{} + if err = json.Unmarshal(bytes, &jsonObject); err != nil { return nil, err } - err = json.Unmarshal(bytes, &rkeConfig) + + // Most values in RancherKubernetesEngineConfig are defined with struct tags for both JSON and YAML in camelCase. + // Changing the tags will be a breaking change. For proper deserialization, we must convert all keys to camelCase. + // Note that we ignore kebab-case keys. Users themselves should ensure any relevant keys + // (especially top-level keys in `services`, like `kube-api` or `kube-controller`) are camelCase or snake-case in cluster config. + convertSnakeCaseKeysToCamelCase(jsonObject) + + marshalled, err := json.Marshal(jsonObject) if err != nil { return nil, err } + if err = json.Unmarshal(marshalled, &config); err != nil { + return nil, err + } } + config.Name = ctx.Args().First() + config.Description = ctx.String("description") + ignoreDockerVersion := ctx.BoolT("disable-docker-version") - rkeConfig.IgnoreDockerVersion = &ignoreDockerVersion + config.RancherKubernetesEngineConfig.IgnoreDockerVersion = &ignoreDockerVersion if ctx.String("k8s-version") != "" { - rkeConfig.Version = ctx.String("k8s-version") + config.RancherKubernetesEngineConfig.Version = ctx.String("k8s-version") } if ctx.String("network-provider") != "" { - rkeConfig.Network = &managementClient.NetworkConfig{ + config.RancherKubernetesEngineConfig.Network = &managementClient.NetworkConfig{ Plugin: ctx.String("network-provider"), } } if ctx.String("psp-default-policy") != "" { - rkeConfig.Services = &managementClient.RKEConfigServices{ + config.DefaultPodSecurityPolicyTemplateID = ctx.String("psp-default-policy") + config.RancherKubernetesEngineConfig.Services = &managementClient.RKEConfigServices{ KubeAPI: &managementClient.KubeAPIService{ PodSecurityPolicy: true, }, } } - return rkeConfig, nil + return &config, nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cli-2.6.0/cmd/common.go new/cli-2.6.4/cmd/common.go --- old/cli-2.6.0/cmd/common.go 2021-11-10 22:45:16.000000000 +0100 +++ new/cli-2.6.4/cmd/common.go 2022-02-18 21:28:45.000000000 +0100 @@ -554,23 +554,6 @@ return "", "", fmt.Errorf("Unable to extract clusterid and projectid from [%s]", id) } -func fixTopLevelKeys(bytes []byte) ([]byte, error) { - old := map[string]interface{}{} - new := map[string]interface{}{} - - err := json.Unmarshal(bytes, &old) - if err != nil { - return nil, fmt.Errorf("error unmarshalling: %v", err) - } - - for key, val := range old { - newKey := convert.ToJSONKey(key) - new[newKey] = val - } - - return json.Marshal(new) -} - // Return a JSON blob of the file at path func readFileReturnJSON(path string) ([]byte, error) { file, err := ioutil.ReadFile(path) @@ -584,6 +567,23 @@ return yaml.YAMLToJSON(file) } +// renameKeys renames the keys in a given map of arbitrary depth with a provided function for string keys. +func renameKeys(input map[string]interface{}, f func(string) string) { + for k, v := range input { + delete(input, k) + newKey := f(k) + input[newKey] = v + if innerMap, ok := v.(map[string]interface{}); ok { + renameKeys(innerMap, f) + } + } +} + +// convertSnakeCaseKeysToCamelCase takes a map and recursively transforms all snake_case keys into camelCase keys. +func convertSnakeCaseKeysToCamelCase(input map[string]interface{}) { + renameKeys(input, convert.ToJSONKey) +} + // Return true if the first non-whitespace bytes in buf is prefix. func hasPrefix(buf []byte, prefix []byte) bool { trim := bytes.TrimLeftFunc(buf, unicode.IsSpace) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cli-2.6.0/cmd/common_test.go new/cli-2.6.4/cmd/common_test.go --- old/cli-2.6.0/cmd/common_test.go 2021-11-10 22:45:16.000000000 +0100 +++ new/cli-2.6.4/cmd/common_test.go 2022-02-18 21:28:45.000000000 +0100 @@ -30,6 +30,35 @@ testParse(c, "c-m-123:p-12345", "", "", true) } +func (s *CommonTestSuite) TestConvertSnakeCaseKeysToCamelCase(c *check.C) { + cases := []struct { + input map[string]interface{} + renamed map[string]interface{} + }{ + { + map[string]interface{}{"foo_bar": "hello"}, + map[string]interface{}{"fooBar": "hello"}, + }, + { + map[string]interface{}{"fooBar": "hello"}, + map[string]interface{}{"fooBar": "hello"}, + }, + { + map[string]interface{}{"foobar": "hello", "some_key": "valueUnmodified", "bar-baz": "bar-baz"}, + map[string]interface{}{"foobar": "hello", "someKey": "valueUnmodified", "bar-baz": "bar-baz"}, + }, + { + map[string]interface{}{"foo_bar": "hello", "backup_config": map[string]interface{}{"hello_world": true}, "config_id": 123}, + map[string]interface{}{"fooBar": "hello", "backupConfig": map[string]interface{}{"helloWorld": true}, "configId": 123}, + }, + } + + for _, tc := range cases { + convertSnakeCaseKeysToCamelCase(tc.input) + c.Assert(tc.input, check.DeepEquals, tc.renamed) + } +} + func testParse(c *check.C, testID, expectedCluster, expectedProject string, errorExpected bool) { actualCluster, actualProject, actualErr := parseClusterAndProjectID(testID) c.Assert(actualCluster, check.Equals, expectedCluster) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cli-2.6.0/scripts/build new/cli-2.6.4/scripts/build --- old/cli-2.6.0/scripts/build 2021-11-10 22:45:16.000000000 +0100 +++ new/cli-2.6.4/scripts/build 2022-02-18 21:28:45.000000000 +0100 @@ -7,7 +7,7 @@ declare -A OS_ARCH_ARG OS_PLATFORM_ARG=(linux windows darwin) -OS_ARCH_ARG[linux]="amd64 arm" +OS_ARCH_ARG[linux]="amd64 arm s390x" OS_ARCH_ARG[windows]="386 amd64" OS_ARCH_ARG[darwin]="amd64" ++++++ vendor.tar.gz ++++++