mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-09-28 22:16:04 +00:00
Make App Engine applications updatable.
No longer ForceNew when adding an App Engine application to a project, when modifying the auth domain, modifying the serving status, or modifying the feature settings.
This commit is contained in:
parent
5f0dcf4787
commit
d0a6b2b5b5
@ -116,16 +116,12 @@ func appEngineResource() *schema.Resource {
|
|||||||
"auth_domain": &schema.Schema{
|
"auth_domain": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
// We're having trouble with PATCH throwing 400s/500s, so we need this
|
|
||||||
// to force a new resource until we can get updating working.
|
|
||||||
ForceNew: true,
|
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
"location_id": &schema.Schema{
|
"location_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
ForceNew: true,
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{
|
ValidateFunc: validation.StringInSlice([]string{
|
||||||
"northamerica-northeast1",
|
"northamerica-northeast1",
|
||||||
"us-central",
|
"us-central",
|
||||||
@ -147,9 +143,6 @@ func appEngineResource() *schema.Resource {
|
|||||||
"serving_status": &schema.Schema{
|
"serving_status": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
// We're having trouble with PATCH throwing 400s/500s, so we need this
|
|
||||||
// to force a new resource until we can get updating working.
|
|
||||||
ForceNew: true,
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{
|
ValidateFunc: validation.StringInSlice([]string{
|
||||||
"UNSPECIFIED",
|
"UNSPECIFIED",
|
||||||
"SERVING",
|
"SERVING",
|
||||||
@ -174,9 +167,6 @@ func appEngineResource() *schema.Resource {
|
|||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
// We're having trouble with PATCH throwing 400s/500s, so we need this
|
|
||||||
// to force a new resource until we can get updating working.
|
|
||||||
ForceNew: true,
|
|
||||||
MaxItems: 1,
|
MaxItems: 1,
|
||||||
Elem: appEngineFeatureSettingsResource(),
|
Elem: appEngineFeatureSettingsResource(),
|
||||||
},
|
},
|
||||||
@ -216,7 +206,12 @@ func appEngineFeatureSettingsResource() *schema.Resource {
|
|||||||
|
|
||||||
func resourceGoogleProjectCustomizeDiff(diff *schema.ResourceDiff, meta interface{}) error {
|
func resourceGoogleProjectCustomizeDiff(diff *schema.ResourceDiff, meta interface{}) error {
|
||||||
// don't need to check if changed, the call is a no-op/error if there's no change
|
// don't need to check if changed, the call is a no-op/error if there's no change
|
||||||
diff.ForceNew("app_engine")
|
if old, new := diff.GetChange("app_engine.#"); old != nil && new != nil && old.(int) > 0 && new.(int) < 1 {
|
||||||
|
diff.ForceNew("app_engine")
|
||||||
|
}
|
||||||
|
if old, new := diff.GetChange("app_engine.0.location_id"); diff.HasChange("app_engine.0.location_id") && old != nil && new != nil && old.(string) != "" {
|
||||||
|
diff.ForceNew("app_engine.0.location_id")
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,19 +271,10 @@ func resourceGoogleProjectCreate(d *schema.ResourceData, meta interface{}) error
|
|||||||
return fmt.Errorf("Error enabling the App Engine Admin API required to configure App Engine applications: %s", err)
|
return fmt.Errorf("Error enabling the App Engine Admin API required to configure App Engine applications: %s", err)
|
||||||
}
|
}
|
||||||
log.Printf("[DEBUG] Enabled App Engine")
|
log.Printf("[DEBUG] Enabled App Engine")
|
||||||
app.Id = pid
|
err = createAppEngineApp(config, pid, app)
|
||||||
log.Printf("[DEBUG] Creating App Engine App")
|
|
||||||
op, err := config.clientAppEngine.Apps.Create(app).Do()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error creating App Engine application: %s", err.Error())
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the operation to complete
|
|
||||||
waitErr := appEngineOperationWait(config.clientAppEngine, op, pid, "App Engine app to create")
|
|
||||||
if waitErr != nil {
|
|
||||||
return waitErr
|
|
||||||
}
|
|
||||||
log.Printf("[DEBUG] Created App Engine App")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = resourceGoogleProjectRead(d, meta)
|
err = resourceGoogleProjectRead(d, meta)
|
||||||
@ -313,6 +299,23 @@ func resourceGoogleProjectCreate(d *schema.ResourceData, meta interface{}) error
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createAppEngineApp(config *Config, pid string, app *appengine.Application) error {
|
||||||
|
app.Id = pid
|
||||||
|
log.Printf("[DEBUG] Creating App Engine App")
|
||||||
|
op, err := config.clientAppEngine.Apps.Create(app).Do()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Error creating App Engine application: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the operation to complete
|
||||||
|
waitErr := appEngineOperationWait(config.clientAppEngine, op, pid, "App Engine app to create")
|
||||||
|
if waitErr != nil {
|
||||||
|
return waitErr
|
||||||
|
}
|
||||||
|
log.Printf("[DEBUG] Created App Engine App")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func resourceGoogleProjectRead(d *schema.ResourceData, meta interface{}) error {
|
func resourceGoogleProjectRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
config := meta.(*Config)
|
config := meta.(*Config)
|
||||||
pid := d.Id()
|
pid := d.Id()
|
||||||
@ -492,10 +495,39 @@ func resourceGoogleProjectUpdate(d *schema.ResourceData, meta interface{}) error
|
|||||||
d.SetPartial("labels")
|
d.SetPartial("labels")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore app_engine changes, they don't work anyways.
|
// App Engine App has changed
|
||||||
|
if ok := d.HasChange("app_engine"); ok {
|
||||||
|
app, err := expandAppEngineApp(d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// ignore if app is now not set; that should force new resource using customizediff
|
||||||
|
if app != nil {
|
||||||
|
if old, new := d.GetChange("app_engine.#"); (old == nil || old.(int) < 1) && new != nil && new.(int) > 0 {
|
||||||
|
err = createAppEngineApp(config, pid, app)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("[DEBUG] Updating App Engine App")
|
||||||
|
op, err := config.clientAppEngine.Apps.Patch(pid, app).UpdateMask("authDomain,servingStatus,featureSettings.splitHealthChecks").Do()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Error creating App Engine application: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the operation to complete
|
||||||
|
waitErr := appEngineOperationWait(config.clientAppEngine, op, pid, "App Engine app to update")
|
||||||
|
if waitErr != nil {
|
||||||
|
return waitErr
|
||||||
|
}
|
||||||
|
log.Printf("[DEBUG] Updated App Engine App")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
d.Partial(false)
|
d.Partial(false)
|
||||||
|
|
||||||
return nil
|
return resourceGoogleProjectRead(d, meta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourceGoogleProjectDelete(d *schema.ResourceData, meta interface{}) error {
|
func resourceGoogleProjectDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
@ -216,6 +216,52 @@ func TestAccProject_appEngineBasic(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccProject_appEngineUpdate(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
org := getTestOrgFromEnv(t)
|
||||||
|
pid := acctest.RandomWithPrefix("tf-test")
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
Config: testAccProject_appEngineNoApp(pid, org),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckGoogleProjectExists("google_project.acceptance", pid),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Config: testAccProject_appEngineBasic(pid, org),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckGoogleProjectExists("google_project.acceptance", pid),
|
||||||
|
resource.TestCheckResourceAttrSet("google_project.acceptance", "app_engine.0.name"),
|
||||||
|
resource.TestCheckResourceAttrSet("google_project.acceptance", "app_engine.0.url_dispatch_rule.#"),
|
||||||
|
resource.TestCheckResourceAttrSet("google_project.acceptance", "app_engine.0.code_bucket"),
|
||||||
|
resource.TestCheckResourceAttrSet("google_project.acceptance", "app_engine.0.default_hostname"),
|
||||||
|
resource.TestCheckResourceAttrSet("google_project.acceptance", "app_engine.0.default_bucket"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
ResourceName: "google_project.acceptance",
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Config: testAccProject_appEngineUpdate(pid, org),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckGoogleProjectExists("google_project.acceptance", pid),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
ResourceName: "google_project.acceptance",
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAccProject_appEngineFeatureSettings(t *testing.T) {
|
func TestAccProject_appEngineFeatureSettings(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@ -236,6 +282,17 @@ func TestAccProject_appEngineFeatureSettings(t *testing.T) {
|
|||||||
ImportState: true,
|
ImportState: true,
|
||||||
ImportStateVerify: true,
|
ImportStateVerify: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Config: testAccProject_appEngineFeatureSettingsUpdate(pid, org),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckGoogleProjectExists("google_project.acceptance", pid),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
ResourceName: "google_project.acceptance",
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -402,6 +459,15 @@ resource "google_folder" "folder1" {
|
|||||||
`, pid, projectName, folderName, org)
|
`, pid, projectName, folderName, org)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccProject_appEngineNoApp(pid, org string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_project" "acceptance" {
|
||||||
|
project_id = "%s"
|
||||||
|
name = "%s"
|
||||||
|
org_id = "%s"
|
||||||
|
}`, pid, pid, org)
|
||||||
|
}
|
||||||
|
|
||||||
func testAccProject_appEngineBasic(pid, org string) string {
|
func testAccProject_appEngineBasic(pid, org string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
resource "google_project" "acceptance" {
|
resource "google_project" "acceptance" {
|
||||||
@ -417,6 +483,21 @@ resource "google_project" "acceptance" {
|
|||||||
}`, pid, pid, org)
|
}`, pid, pid, org)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccProject_appEngineUpdate(pid, org string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_project" "acceptance" {
|
||||||
|
project_id = "%s"
|
||||||
|
name = "%s"
|
||||||
|
org_id = "%s"
|
||||||
|
|
||||||
|
app_engine {
|
||||||
|
auth_domain = "tf-test.club"
|
||||||
|
location_id = "us-central"
|
||||||
|
serving_status = "USER_DISABLED"
|
||||||
|
}
|
||||||
|
}`, pid, pid, org)
|
||||||
|
}
|
||||||
|
|
||||||
func testAccProject_appEngineFeatureSettings(pid, org string) string {
|
func testAccProject_appEngineFeatureSettings(pid, org string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
resource "google_project" "acceptance" {
|
resource "google_project" "acceptance" {
|
||||||
@ -433,6 +514,22 @@ resource "google_project" "acceptance" {
|
|||||||
}`, pid, pid, org)
|
}`, pid, pid, org)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccProject_appEngineFeatureSettingsUpdate(pid, org string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_project" "acceptance" {
|
||||||
|
project_id = "%s"
|
||||||
|
name = "%s"
|
||||||
|
org_id = "%s"
|
||||||
|
|
||||||
|
app_engine {
|
||||||
|
location_id = "us-central"
|
||||||
|
feature_settings {
|
||||||
|
"split_health_checks" = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`, pid, pid, org)
|
||||||
|
}
|
||||||
|
|
||||||
func skipIfEnvNotSet(t *testing.T, envs ...string) {
|
func skipIfEnvNotSet(t *testing.T, envs ...string) {
|
||||||
for _, k := range envs {
|
for _, k := range envs {
|
||||||
if os.Getenv(k) == "" {
|
if os.Getenv(k) == "" {
|
||||||
|
Loading…
Reference in New Issue
Block a user