github.com/skyscape-cloud-services/terraform@v0.9.2-0.20170609144644-7ece028a1747/builtin/providers/rancher/resource_rancher_registry_credential.go (about) 1 package rancher 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/helper/schema" 10 rancherClient "github.com/rancher/go-rancher/v2" 11 ) 12 13 func resourceRancherRegistryCredential() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceRancherRegistryCredentialCreate, 16 Read: resourceRancherRegistryCredentialRead, 17 Update: resourceRancherRegistryCredentialUpdate, 18 Delete: resourceRancherRegistryCredentialDelete, 19 Importer: &schema.ResourceImporter{ 20 State: resourceRancherRegistryCredentialImport, 21 }, 22 23 Schema: map[string]*schema.Schema{ 24 "id": &schema.Schema{ 25 Type: schema.TypeString, 26 Computed: true, 27 }, 28 "name": &schema.Schema{ 29 Type: schema.TypeString, 30 Required: true, 31 }, 32 "description": &schema.Schema{ 33 Type: schema.TypeString, 34 Optional: true, 35 }, 36 "registry_id": &schema.Schema{ 37 Type: schema.TypeString, 38 Required: true, 39 ForceNew: true, 40 }, 41 "email": &schema.Schema{ 42 Type: schema.TypeString, 43 Required: true, 44 }, 45 "public_value": &schema.Schema{ 46 Type: schema.TypeString, 47 Required: true, 48 }, 49 "secret_value": &schema.Schema{ 50 Type: schema.TypeString, 51 Required: true, 52 ForceNew: true, 53 }, 54 }, 55 } 56 } 57 58 func resourceRancherRegistryCredentialCreate(d *schema.ResourceData, meta interface{}) error { 59 log.Printf("[INFO] Creating RegistryCredential: %s", d.Id()) 60 client, err := meta.(*Config).RegistryClient(d.Get("registry_id").(string)) 61 if err != nil { 62 return err 63 } 64 65 name := d.Get("name").(string) 66 description := d.Get("description").(string) 67 publicValue := d.Get("public_value").(string) 68 secretValue := d.Get("secret_value").(string) 69 registryID := d.Get("registry_id").(string) 70 71 registryCred := rancherClient.RegistryCredential{ 72 Name: name, 73 Description: description, 74 PublicValue: publicValue, 75 SecretValue: secretValue, 76 RegistryId: registryID, 77 } 78 newRegistryCredential, err := client.RegistryCredential.Create(®istryCred) 79 if err != nil { 80 return err 81 } 82 83 stateConf := &resource.StateChangeConf{ 84 Pending: []string{"active", "removed", "removing"}, 85 Target: []string{"active"}, 86 Refresh: RegistryCredentialStateRefreshFunc(client, newRegistryCredential.Id), 87 Timeout: 10 * time.Minute, 88 Delay: 1 * time.Second, 89 MinTimeout: 3 * time.Second, 90 } 91 _, waitErr := stateConf.WaitForState() 92 if waitErr != nil { 93 return fmt.Errorf( 94 "Error waiting for registry credential (%s) to be created: %s", newRegistryCredential.Id, waitErr) 95 } 96 97 d.SetId(newRegistryCredential.Id) 98 log.Printf("[INFO] RegistryCredential ID: %s", d.Id()) 99 100 return resourceRancherRegistryCredentialRead(d, meta) 101 } 102 103 func resourceRancherRegistryCredentialRead(d *schema.ResourceData, meta interface{}) error { 104 log.Printf("[INFO] Refreshing RegistryCredential: %s", d.Id()) 105 client, err := meta.(*Config).RegistryClient(d.Get("registry_id").(string)) 106 if err != nil { 107 return err 108 } 109 110 registryCred, err := client.RegistryCredential.ById(d.Id()) 111 if err != nil { 112 return err 113 } 114 115 if registryCred == nil { 116 log.Printf("[INFO] RegistryCredential %s not found", d.Id()) 117 d.SetId("") 118 return nil 119 } 120 121 if removed(registryCred.State) { 122 log.Printf("[INFO] Registry Credential %s was removed on %v", d.Id(), registryCred.Removed) 123 d.SetId("") 124 return nil 125 } 126 127 log.Printf("[INFO] RegistryCredential Name: %s", registryCred.Name) 128 129 d.Set("description", registryCred.Description) 130 d.Set("name", registryCred.Name) 131 d.Set("public_value", registryCred.PublicValue) 132 d.Set("registry_id", registryCred.RegistryId) 133 134 return nil 135 } 136 137 func resourceRancherRegistryCredentialUpdate(d *schema.ResourceData, meta interface{}) error { 138 log.Printf("[INFO] Updating RegistryCredential: %s", d.Id()) 139 client, err := meta.(*Config).RegistryClient(d.Get("registry_id").(string)) 140 if err != nil { 141 return err 142 } 143 144 registryCred, err := client.RegistryCredential.ById(d.Id()) 145 if err != nil { 146 return err 147 } 148 149 name := d.Get("name").(string) 150 description := d.Get("description").(string) 151 publicValue := d.Get("public_value").(string) 152 secretValue := d.Get("secret_value").(string) 153 154 registryCred.Name = name 155 registryCred.Description = description 156 registryCred.PublicValue = publicValue 157 registryCred.SecretValue = secretValue 158 client.RegistryCredential.Update(registryCred, ®istryCred) 159 160 return resourceRancherRegistryCredentialRead(d, meta) 161 } 162 163 func resourceRancherRegistryCredentialDelete(d *schema.ResourceData, meta interface{}) error { 164 log.Printf("[INFO] Deleting RegistryCredential: %s", d.Id()) 165 id := d.Id() 166 client, err := meta.(*Config).RegistryClient(d.Get("registry_id").(string)) 167 if err != nil { 168 return err 169 } 170 171 reg, err := client.RegistryCredential.ById(id) 172 if err != nil { 173 return err 174 } 175 176 // Step 1: Deactivate 177 if _, e := client.RegistryCredential.ActionDeactivate(reg); e != nil { 178 return fmt.Errorf("Error deactivating RegistryCredential: %s", err) 179 } 180 181 log.Printf("[DEBUG] Waiting for registry credential (%s) to be deactivated", id) 182 183 stateConf := &resource.StateChangeConf{ 184 Pending: []string{"active", "inactive", "deactivating"}, 185 Target: []string{"inactive"}, 186 Refresh: RegistryCredentialStateRefreshFunc(client, id), 187 Timeout: 10 * time.Minute, 188 Delay: 1 * time.Second, 189 MinTimeout: 3 * time.Second, 190 } 191 192 _, waitErr := stateConf.WaitForState() 193 if waitErr != nil { 194 return fmt.Errorf( 195 "Error waiting for registry credential (%s) to be deactivated: %s", id, waitErr) 196 } 197 198 // Update resource to reflect its state 199 reg, err = client.RegistryCredential.ById(id) 200 if err != nil { 201 return fmt.Errorf("Failed to refresh state of deactivated registry credential (%s): %s", id, err) 202 } 203 204 // Step 2: Remove 205 if _, err := client.RegistryCredential.ActionRemove(reg); err != nil { 206 return fmt.Errorf("Error removing RegistryCredential: %s", err) 207 } 208 209 log.Printf("[DEBUG] Waiting for registry (%s) to be removed", id) 210 211 stateConf = &resource.StateChangeConf{ 212 Pending: []string{"inactive", "removed", "removing"}, 213 Target: []string{"removed"}, 214 Refresh: RegistryCredentialStateRefreshFunc(client, id), 215 Timeout: 10 * time.Minute, 216 Delay: 1 * time.Second, 217 MinTimeout: 3 * time.Second, 218 } 219 220 _, waitErr = stateConf.WaitForState() 221 if waitErr != nil { 222 return fmt.Errorf( 223 "Error waiting for registry (%s) to be removed: %s", id, waitErr) 224 } 225 226 d.SetId("") 227 return nil 228 } 229 230 func resourceRancherRegistryCredentialImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { 231 regID, resourceID := splitID(d.Id()) 232 d.SetId(resourceID) 233 if regID != "" { 234 d.Set("registry_id", regID) 235 } else { 236 client, err := meta.(*Config).GlobalClient() 237 if err != nil { 238 return []*schema.ResourceData{}, err 239 } 240 cred, err := client.RegistryCredential.ById(d.Id()) 241 if err != nil { 242 return []*schema.ResourceData{}, err 243 } 244 d.Set("registry_id", cred.RegistryId) 245 } 246 return []*schema.ResourceData{d}, nil 247 } 248 249 // RegistryCredentialStateRefreshFunc returns a resource.StateRefreshFunc that is used to watch 250 // a Rancher Environment. 251 func RegistryCredentialStateRefreshFunc(client *rancherClient.RancherClient, registryCredID string) resource.StateRefreshFunc { 252 return func() (interface{}, string, error) { 253 regC, err := client.RegistryCredential.ById(registryCredID) 254 255 if err != nil { 256 return nil, "", err 257 } 258 259 return regC, regC.State, nil 260 } 261 }