providers/ibm/ibm_kp.go (190 lines of code) (raw):
// Copyright 2019 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ibm
import (
"context"
"fmt"
"os"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"github.com/IBM-Cloud/bluemix-go"
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog"
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2"
"github.com/IBM-Cloud/bluemix-go/session"
kp "github.com/IBM/keyprotect-go-client"
)
type KPGenerator struct {
IBMService
}
func (g KPGenerator) loadKP() func(kpID, kpName string) terraformutils.Resource {
names := make(map[string]struct{})
random := true
return func(kpID, kpName string) terraformutils.Resource {
names, random = getRandom(names, kpName, random)
resource := terraformutils.NewSimpleResource(
kpID,
normalizeResourceName(kpName, random),
"ibm_resource_instance",
"ibm",
[]string{})
return resource
}
}
func (g KPGenerator) loadkPKeys() func(kpKeyCRN, kpKeyName string, dependsOn []string) terraformutils.Resource {
names := make(map[string]struct{})
random := true
return func(kpKeyCRN, kpKeyName string, dependsOn []string) terraformutils.Resource {
names, random = getRandom(names, kpKeyName, random)
resource := terraformutils.NewResource(
kpKeyCRN,
normalizeResourceName(kpKeyName, random),
"ibm_kms_key",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resource
}
}
func (g KPGenerator) loadkPKeyAliases() func(kpKeyCRN, kpKeyAlias string, dependsOn []string) terraformutils.Resource {
return func(kpKeyCRN, kpKeyAlias string, dependsOn []string) terraformutils.Resource {
resource := terraformutils.NewResource(
fmt.Sprintf("%s:alias:%s", kpKeyAlias, kpKeyCRN),
normalizeResourceName(kpKeyAlias, true),
"ibm_kms_key_alias",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resource
}
}
func (g KPGenerator) loadKpKeyPolicies() func(kpKeyCRN string, dependsOn []string) terraformutils.Resource {
return func(kpKeyCRN string, dependsOn []string) terraformutils.Resource {
resource := terraformutils.NewResource(
kpKeyCRN,
normalizeResourceName("kp_policies", true),
"ibm_kms_key_policies",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resource
}
}
func (g *KPGenerator) InitResources() error {
region := g.Args["region"].(string)
bmxConfig := &bluemix.Config{
BluemixAPIKey: os.Getenv("IC_API_KEY"),
}
sess, err := session.New(bmxConfig)
if err != nil {
return err
}
catalogClient, err := catalog.New(sess)
if err != nil {
return err
}
controllerClient, err := controllerv2.New(sess)
if err != nil {
return err
}
serviceID, err := catalogClient.ResourceCatalog().FindByName("kms", true)
if err != nil {
return err
}
query := controllerv2.ServiceInstanceQuery{
ServiceID: serviceID[0].ID,
}
kpInstances, err := controllerClient.ResourceServiceInstanceV2().ListInstances(query)
if err != nil {
return err
}
kpurl := fmt.Sprintf("https://%s.kms.cloud.ibm.com", region)
options := kp.ClientConfig{
BaseURL: envFallBack([]string{"IBMCLOUD_KP_API_ENDPOINT"}, kpurl),
APIKey: os.Getenv("IC_API_KEY"),
Verbose: kp.VerboseFailOnly,
}
client, err := kp.New(options, kp.DefaultTransport())
if err != nil {
return err
}
fnObjt := g.loadKP()
for _, kpInstance := range kpInstances {
g.Resources = append(g.Resources, fnObjt(kpInstance.ID, kpInstance.Name))
resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
client.Config.InstanceID = kpInstance.Guid
output, err := client.GetKeys(context.Background(), 100, 0)
if err != nil {
return err
}
fnObjt := g.loadkPKeys()
for _, key := range output.Keys {
var dependsOn []string
dependsOn = append(dependsOn,
"ibm_resource_instance."+resourceName)
g.Resources = append(g.Resources, fnObjt(key.CRN, key.Name, dependsOn))
resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
fnObjt := g.loadkPKeyAliases()
dependsOn = append(dependsOn,
"ibm_kms_key."+resourceName)
for _, alias := range key.Aliases {
g.Resources = append(g.Resources, fnObjt(key.CRN, alias, dependsOn))
}
policies, _ := client.GetPolicies(context.Background(), key.ID)
funObjt := g.loadKpKeyPolicies()
for range policies {
g.Resources = append(g.Resources, funObjt(key.CRN, dependsOn))
}
}
}
return nil
}
func (g *KPGenerator) PostConvertHook() error {
for i, rk := range g.Resources {
if rk.InstanceInfo.Type != "ibm_kms_key" {
continue
}
for _, ri := range g.Resources {
if ri.InstanceInfo.Type != "ibm_resource_instance" {
continue
}
if rk.InstanceState.Attributes["instance_id"] == ri.InstanceState.Attributes["guid"] {
g.Resources[i].Item["instance_id"] = "${ibm_resource_instance." + ri.ResourceName + ".guid}"
}
}
}
for i, ra := range g.Resources {
if ra.InstanceInfo.Type != "ibm_kms_key_alias" {
continue
}
for _, rk := range g.Resources {
if rk.InstanceInfo.Type != "ibm_kms_key" {
continue
}
if ra.InstanceState.Attributes["instance_id"] == rk.InstanceState.Attributes["instance_id"] && ra.InstanceState.Attributes["key_id"] == rk.InstanceState.Attributes["key_id"] {
g.Resources[i].Item["instance_id"] = "${ibm_kms_key." + rk.ResourceName + ".instance_id}"
g.Resources[i].Item["key_id"] = "${ibm_kms_key." + rk.ResourceName + ".key_id}"
}
}
}
for i, rp := range g.Resources {
if rp.InstanceInfo.Type != "ibm_kms_key_policies" {
continue
}
for _, rk := range g.Resources {
if rk.InstanceInfo.Type != "ibm_kms_key" {
continue
}
if rp.InstanceState.Attributes["instance_id"] == rk.InstanceState.Attributes["instance_id"] && rp.InstanceState.Attributes["key_id"] == rk.InstanceState.Attributes["key_id"] {
g.Resources[i].Item["instance_id"] = "${ibm_kms_key." + rk.ResourceName + ".instance_id}"
g.Resources[i].Item["key_id"] = "${ibm_kms_key." + rk.ResourceName + ".key_id}"
}
}
}
return nil
}