From b5f3a23193d5a15aef495e459e998ade102291fa Mon Sep 17 00:00:00 2001 From: kinarashah Date: Fri, 7 Dec 2018 11:43:28 -0800 Subject: [PATCH] credential type --- apis/management.cattle.io/v3/machine_types.go | 17 +++-- apis/management.cattle.io/v3/schema/schema.go | 22 +++++- mapper/credentialmapper.go | 71 +++++++++++++++++++ 3 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 mapper/credentialmapper.go diff --git a/apis/management.cattle.io/v3/machine_types.go b/apis/management.cattle.io/v3/machine_types.go index f161f233..268457bd 100644 --- a/apis/management.cattle.io/v3/machine_types.go +++ b/apis/management.cattle.io/v3/machine_types.go @@ -40,10 +40,11 @@ type NodeTemplateCondition struct { } type NodeTemplateSpec struct { - DisplayName string `json:"displayName"` - Description string `json:"description"` - Driver string `json:"driver" norman:"nocreate,noupdate"` - NodeCommonParams `json:",inline"` + DisplayName string `json:"displayName"` + Description string `json:"description"` + Driver string `json:"driver" norman:"nocreate,noupdate"` + CloudCredentialName string `json:"cloudCredentialName" norman:"type=reference[cloudCredential]"` + NodeCommonParams `json:",inline"` } type Node struct { @@ -292,3 +293,11 @@ type NodeDrainInput struct { // Time to wait (in seconds) before giving up for one try Timeout int `json:"timeout" norman:"min=1,max=10800,default=60"` } + +type CloudCredential struct { + types.Namespaced + + metav1.TypeMeta `json:",inline"` + + metav1.ObjectMeta `json:"metadata,omitempty"` +} diff --git a/apis/management.cattle.io/v3/schema/schema.go b/apis/management.cattle.io/v3/schema/schema.go index ae577fc8..e8f91ac3 100644 --- a/apis/management.cattle.io/v3/schema/schema.go +++ b/apis/management.cattle.io/v3/schema/schema.go @@ -40,7 +40,9 @@ var ( Init(globalDNSTypes). Init(kontainerTypes). Init(etcdBackupTypes). - Init(monitorTypes) + Init(monitorTypes). + Init(credTypes). + Init(mgmtSecretTypes) TokenSchemas = factory.Schemas(&Version). Init(tokens) @@ -55,6 +57,24 @@ func schemaTypes(schemas *types.Schemas) *types.Schemas { MustImport(&Version, v3.DynamicSchema{}) } +func credTypes(schemas *types.Schemas) *types.Schemas { + return schemas. + AddMapperForType(&Version, v3.CloudCredential{}, + &mapper.CredentialMapper{}, + &m.Move{From: "name", To: "id"}, + &m.Drop{Field: "namespaceId"}). + MustImport(&Version, v3.CloudCredential{}) +} + +func mgmtSecretTypes(schemas *types.Schemas) *types.Schemas { + return schemas.MustImportAndCustomize(&Version, v1.Secret{}, func(schema *types.Schema) { + schema.ID = "managementSecret" + schema.PluralName = "managementSecrets" + schema.CodeName = "ManagementSecret" + schema.CodeNamePlural = "ManagementSecrets" + }) +} + func catalogTypes(schemas *types.Schemas) *types.Schemas { return schemas. AddMapperForType(&Version, v3.Catalog{}, diff --git a/mapper/credentialmapper.go b/mapper/credentialmapper.go new file mode 100644 index 00000000..dd09155e --- /dev/null +++ b/mapper/credentialmapper.go @@ -0,0 +1,71 @@ +package mapper + +import ( + "fmt" + "strings" + + "github.com/rancher/norman/types" + "github.com/rancher/norman/types/convert" + "github.com/rancher/norman/types/values" +) + +type CredentialMapper struct { +} + +func (s CredentialMapper) FromInternal(data map[string]interface{}) { + formatData(data) + delete(data, "data") +} + +func (s CredentialMapper) ToInternal(data map[string]interface{}) error { + updateData(data) + return nil +} + +func (s CredentialMapper) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { + return nil +} + +func updateData(data map[string]interface{}) { + stringData := map[string]string{} + for key, val := range data { + if val == nil { + continue + } + if strings.HasSuffix(key, "Config") { + for key2, val2 := range convert.ToMapInterface(val) { + stringData[fmt.Sprintf("%s-%s", key, key2)] = convert.ToString(val2) + } + values.PutValue(data, stringData, "stringData") + delete(data, key) + return + } + } +} + +func formatData(data map[string]interface{}) { + secretData := convert.ToMapInterface(data["data"]) + getKey := func(data map[string]interface{}) string { + for key := range data { + splitKeys := strings.Split(key, "-") + if len(splitKeys) != 2 { + continue + } + if strings.HasSuffix(splitKeys[0], "Config") { + return splitKeys[0] + } + } + return "" + } + config := getKey(secretData) + if config == "" { + return + } + for key, val := range secretData { + splitKeys := strings.Split(key, "-") + if len(splitKeys) != 2 { + continue + } + values.PutValue(data, convert.ToString(val), config, splitKeys[1]) + } +}