github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/ibm/ibm_kp.go (about) 1 // Copyright 2019 The Terraformer Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package ibm 16 17 import ( 18 "context" 19 "fmt" 20 "os" 21 22 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 23 "github.com/IBM-Cloud/bluemix-go" 24 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog" 25 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2" 26 "github.com/IBM-Cloud/bluemix-go/session" 27 kp "github.com/IBM/keyprotect-go-client" 28 ) 29 30 type KPGenerator struct { 31 IBMService 32 } 33 34 func (g KPGenerator) loadKP() func(kpID, kpName string) terraformutils.Resource { 35 names := make(map[string]struct{}) 36 random := true 37 return func(kpID, kpName string) terraformutils.Resource { 38 names, random = getRandom(names, kpName, random) 39 resource := terraformutils.NewSimpleResource( 40 kpID, 41 normalizeResourceName(kpName, random), 42 "ibm_resource_instance", 43 "ibm", 44 []string{}) 45 return resource 46 } 47 } 48 49 func (g KPGenerator) loadkPKeys() func(kpKeyCRN, kpKeyName string, dependsOn []string) terraformutils.Resource { 50 names := make(map[string]struct{}) 51 random := true 52 return func(kpKeyCRN, kpKeyName string, dependsOn []string) terraformutils.Resource { 53 names, random = getRandom(names, kpKeyName, random) 54 resource := terraformutils.NewResource( 55 kpKeyCRN, 56 normalizeResourceName(kpKeyName, random), 57 "ibm_kms_key", 58 "ibm", 59 map[string]string{}, 60 []string{}, 61 map[string]interface{}{ 62 "depends_on": dependsOn, 63 }) 64 return resource 65 } 66 } 67 68 func (g *KPGenerator) InitResources() error { 69 region := g.Args["region"].(string) 70 bmxConfig := &bluemix.Config{ 71 BluemixAPIKey: os.Getenv("IC_API_KEY"), 72 } 73 sess, err := session.New(bmxConfig) 74 if err != nil { 75 return err 76 } 77 78 catalogClient, err := catalog.New(sess) 79 if err != nil { 80 return err 81 } 82 83 controllerClient, err := controllerv2.New(sess) 84 if err != nil { 85 return err 86 } 87 88 serviceID, err := catalogClient.ResourceCatalog().FindByName("kms", true) 89 if err != nil { 90 return err 91 } 92 query := controllerv2.ServiceInstanceQuery{ 93 ServiceID: serviceID[0].ID, 94 } 95 kpInstances, err := controllerClient.ResourceServiceInstanceV2().ListInstances(query) 96 if err != nil { 97 return err 98 } 99 kpurl := fmt.Sprintf("https://%s.kms.cloud.ibm.com", region) 100 options := kp.ClientConfig{ 101 BaseURL: envFallBack([]string{"IBMCLOUD_KP_API_ENDPOINT"}, kpurl), 102 APIKey: os.Getenv("IC_API_KEY"), 103 Verbose: kp.VerboseFailOnly, 104 } 105 106 client, err := kp.New(options, kp.DefaultTransport()) 107 if err != nil { 108 return err 109 } 110 fnObjt := g.loadKP() 111 for _, kpInstance := range kpInstances { 112 g.Resources = append(g.Resources, fnObjt(kpInstance.ID, kpInstance.Name)) 113 resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 114 client.Config.InstanceID = kpInstance.Guid 115 116 output, err := client.GetKeys(context.Background(), 100, 0) 117 if err != nil { 118 return err 119 } 120 fnObjt := g.loadkPKeys() 121 for _, key := range output.Keys { 122 var dependsOn []string 123 dependsOn = append(dependsOn, 124 "ibm_resource_instance."+resourceName) 125 g.Resources = append(g.Resources, fnObjt(key.CRN, key.Name, dependsOn)) 126 } 127 128 } 129 130 return nil 131 }