github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/google/resource_google_project_migrate.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/terraform"
     8  )
     9  
    10  func resourceGoogleProjectMigrateState(v int, s *terraform.InstanceState, meta interface{}) (*terraform.InstanceState, error) {
    11  	if s.Empty() {
    12  		log.Println("[DEBUG] Empty InstanceState; nothing to migrate.")
    13  		return s, nil
    14  	}
    15  
    16  	switch v {
    17  	case 0:
    18  		log.Println("[INFO] Found Google Project State v0; migrating to v1")
    19  		s, err := migrateGoogleProjectStateV0toV1(s, meta.(*Config))
    20  		if err != nil {
    21  			return s, err
    22  		}
    23  		return s, nil
    24  	default:
    25  		return s, fmt.Errorf("Unexpected schema version: %d", v)
    26  	}
    27  }
    28  
    29  // This migration adjusts google_project resources to include several additional attributes
    30  // required to support project creation/deletion that was added in V1.
    31  func migrateGoogleProjectStateV0toV1(s *terraform.InstanceState, config *Config) (*terraform.InstanceState, error) {
    32  	log.Printf("[DEBUG] Attributes before migration: %#v", s.Attributes)
    33  
    34  	s.Attributes["skip_delete"] = "true"
    35  	s.Attributes["project_id"] = s.ID
    36  
    37  	if s.Attributes["policy_data"] != "" {
    38  		p, err := getProjectIamPolicy(s.ID, config)
    39  		if err != nil {
    40  			return s, fmt.Errorf("Could not retrieve project's IAM policy while attempting to migrate state from V0 to V1: %v", err)
    41  		}
    42  		s.Attributes["policy_etag"] = p.Etag
    43  	}
    44  
    45  	log.Printf("[DEBUG] Attributes after migration: %#v", s.Attributes)
    46  	return s, nil
    47  }