2018-05-14 16:52:33 +00:00
// ----------------------------------------------------------------------------
//
// *** AUTO GENERATED CODE *** AUTO GENERATED CODE ***
//
// ----------------------------------------------------------------------------
//
// This file is automatically generated by Magic Modules and manual
// changes will be clobbered when the file is regenerated.
//
// Please read more about how to change this file in
// .github/CONTRIBUTING.md.
//
// ----------------------------------------------------------------------------
2018-03-26 23:53:35 +00:00
package google
import (
"fmt"
2018-05-14 16:52:33 +00:00
"log"
2018-06-19 20:56:06 +00:00
"reflect"
2018-03-26 23:53:35 +00:00
"time"
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"
2018-04-24 21:43:00 +00:00
compute "google.golang.org/api/compute/v1"
2018-03-26 23:53:35 +00:00
)
2018-05-14 16:52:33 +00:00
func sslPolicyCustomizeDiff ( diff * schema . ResourceDiff , v interface { } ) error {
profile := diff . Get ( "profile" )
customFeaturesCount := diff . Get ( "custom_features.#" )
// Validate that policy configs aren't incompatible during all phases
// CUSTOM profile demands non-zero custom_features, and other profiles (i.e., not CUSTOM) demand zero custom_features
if diff . HasChange ( "profile" ) || diff . HasChange ( "custom_features" ) {
if profile . ( string ) == "CUSTOM" {
if customFeaturesCount . ( int ) == 0 {
return fmt . Errorf ( "Error in SSL Policy %s: the profile is set to %s but no custom_features are set." , diff . Get ( "name" ) , profile . ( string ) )
}
} else {
if customFeaturesCount != 0 {
return fmt . Errorf ( "Error in SSL Policy %s: the profile is set to %s but using custom_features requires the profile to be CUSTOM." , diff . Get ( "name" ) , profile . ( string ) )
}
}
return nil
}
return nil
}
2018-03-26 23:53:35 +00:00
func resourceComputeSslPolicy ( ) * schema . Resource {
return & schema . Resource {
Create : resourceComputeSslPolicyCreate ,
Read : resourceComputeSslPolicyRead ,
Update : resourceComputeSslPolicyUpdate ,
Delete : resourceComputeSslPolicyDelete ,
Importer : & schema . ResourceImporter {
2018-05-14 16:52:33 +00:00
State : resourceComputeSslPolicyImport ,
2018-03-26 23:53:35 +00:00
} ,
Timeouts : & schema . ResourceTimeout {
2018-05-14 16:52:33 +00:00
Create : schema . DefaultTimeout ( 240 * time . Second ) ,
Update : schema . DefaultTimeout ( 240 * time . Second ) ,
Delete : schema . DefaultTimeout ( 240 * time . Second ) ,
2018-03-26 23:53:35 +00:00
} ,
2018-05-14 16:52:33 +00:00
CustomizeDiff : sslPolicyCustomizeDiff ,
2018-03-26 23:53:35 +00:00
Schema : map [ string ] * schema . Schema {
2018-05-14 16:52:33 +00:00
"name" : {
2018-03-26 23:53:35 +00:00
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
} ,
2018-09-20 20:22:36 +00:00
"custom_features" : {
Type : schema . TypeSet ,
Optional : true ,
Elem : & schema . Schema {
Type : schema . TypeString ,
} ,
Set : schema . HashString ,
} ,
2018-05-14 16:52:33 +00:00
"description" : {
2018-03-26 23:53:35 +00:00
Type : schema . TypeString ,
Optional : true ,
2018-05-14 16:52:33 +00:00
ForceNew : true ,
2018-03-26 23:53:35 +00:00
} ,
2018-05-14 16:52:33 +00:00
"min_tls_version" : {
Type : schema . TypeString ,
Optional : true ,
ValidateFunc : validation . StringInSlice ( [ ] string { "TLS_1_0" , "TLS_1_1" , "TLS_1_2" , "" } , false ) ,
Default : "TLS_1_0" ,
} ,
2018-09-20 20:22:36 +00:00
"profile" : {
Type : schema . TypeString ,
Optional : true ,
ValidateFunc : validation . StringInSlice ( [ ] string { "COMPATIBLE" , "MODERN" , "RESTRICTED" , "CUSTOM" , "" } , false ) ,
Default : "COMPATIBLE" ,
2018-05-14 16:52:33 +00:00
} ,
"creation_timestamp" : {
Type : schema . TypeString ,
2018-03-26 23:53:35 +00:00
Computed : true ,
} ,
2018-05-14 16:52:33 +00:00
"enabled_features" : {
2018-03-26 23:53:35 +00:00
Type : schema . TypeSet ,
Computed : true ,
2018-05-14 16:52:33 +00:00
Elem : & schema . Schema {
Type : schema . TypeString ,
} ,
Set : schema . HashString ,
2018-03-26 23:53:35 +00:00
} ,
2018-05-14 16:52:33 +00:00
"fingerprint" : {
2018-03-26 23:53:35 +00:00
Type : schema . TypeString ,
Computed : true ,
} ,
2018-05-14 16:52:33 +00:00
"project" : {
Type : schema . TypeString ,
Optional : true ,
Computed : true ,
ForceNew : true ,
} ,
"self_link" : {
2018-03-26 23:53:35 +00:00
Type : schema . TypeString ,
Computed : true ,
} ,
} ,
}
}
func resourceComputeSslPolicyCreate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-06-19 20:56:06 +00:00
obj := make ( map [ string ] interface { } )
2018-05-14 16:52:33 +00:00
descriptionProp , err := expandComputeSslPolicyDescription ( d . Get ( "description" ) , d , config )
if err != nil {
return err
2018-06-22 00:46:50 +00:00
} else if v , ok := d . GetOkExists ( "description" ) ; ! isEmptyValue ( reflect . ValueOf ( descriptionProp ) ) && ( ok || ! reflect . DeepEqual ( v , descriptionProp ) ) {
2018-06-19 20:56:06 +00:00
obj [ "description" ] = descriptionProp
2018-05-14 16:52:33 +00:00
}
nameProp , err := expandComputeSslPolicyName ( d . Get ( "name" ) , d , config )
if err != nil {
return err
2018-06-22 00:46:50 +00:00
} else if v , ok := d . GetOkExists ( "name" ) ; ! isEmptyValue ( reflect . ValueOf ( nameProp ) ) && ( ok || ! reflect . DeepEqual ( v , nameProp ) ) {
2018-06-19 20:56:06 +00:00
obj [ "name" ] = nameProp
2018-05-14 16:52:33 +00:00
}
profileProp , err := expandComputeSslPolicyProfile ( d . Get ( "profile" ) , d , config )
if err != nil {
return err
2018-06-22 00:46:50 +00:00
} else if v , ok := d . GetOkExists ( "profile" ) ; ! isEmptyValue ( reflect . ValueOf ( profileProp ) ) && ( ok || ! reflect . DeepEqual ( v , profileProp ) ) {
2018-06-19 20:56:06 +00:00
obj [ "profile" ] = profileProp
2018-05-14 16:52:33 +00:00
}
minTlsVersionProp , err := expandComputeSslPolicyMinTlsVersion ( d . Get ( "min_tls_version" ) , d , config )
if err != nil {
return err
2018-06-22 00:46:50 +00:00
} else if v , ok := d . GetOkExists ( "min_tls_version" ) ; ! isEmptyValue ( reflect . ValueOf ( minTlsVersionProp ) ) && ( ok || ! reflect . DeepEqual ( v , minTlsVersionProp ) ) {
2018-06-19 20:56:06 +00:00
obj [ "minTlsVersion" ] = minTlsVersionProp
2018-05-14 16:52:33 +00:00
}
customFeaturesProp , err := expandComputeSslPolicyCustomFeatures ( d . Get ( "custom_features" ) , d , config )
if err != nil {
return err
2018-06-22 00:46:50 +00:00
} else if v , ok := d . GetOkExists ( "custom_features" ) ; ! isEmptyValue ( reflect . ValueOf ( customFeaturesProp ) ) && ( ok || ! reflect . DeepEqual ( v , customFeaturesProp ) ) {
2018-06-19 20:56:06 +00:00
obj [ "customFeatures" ] = customFeaturesProp
2018-03-26 23:53:35 +00:00
}
2018-05-14 16:52:33 +00:00
url , err := replaceVars ( d , config , "https://www.googleapis.com/compute/v1/projects/{{project}}/global/sslPolicies" )
2018-03-26 23:53:35 +00:00
if err != nil {
2018-05-14 16:52:33 +00:00
return err
2018-03-26 23:53:35 +00:00
}
2018-05-14 16:52:33 +00:00
log . Printf ( "[DEBUG] Creating new SslPolicy: %#v" , obj )
2018-08-08 22:29:10 +00:00
res , err := sendRequest ( config , "POST" , url , obj )
2018-05-14 16:52:33 +00:00
if err != nil {
return fmt . Errorf ( "Error creating SslPolicy: %s" , err )
}
// Store the ID now
id , err := replaceVars ( d , config , "{{name}}" )
if err != nil {
return fmt . Errorf ( "Error constructing id: %s" , err )
}
d . SetId ( id )
2018-03-26 23:53:35 +00:00
2018-08-16 19:16:14 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
op := & compute . Operation { }
err = Convert ( res , op )
2018-03-26 23:53:35 +00:00
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
waitErr := computeOperationWaitTime (
config . clientCompute , op , project , "Creating SslPolicy" ,
int ( d . Timeout ( schema . TimeoutCreate ) . Minutes ( ) ) )
if waitErr != nil {
// The resource didn't actually create
d . SetId ( "" )
return fmt . Errorf ( "Error waiting to create SslPolicy: %s" , waitErr )
}
2018-05-17 23:33:30 +00:00
log . Printf ( "[DEBUG] Finished creating SslPolicy %q: %#v" , d . Id ( ) , res )
2018-03-26 23:53:35 +00:00
return resourceComputeSslPolicyRead ( d , meta )
}
func resourceComputeSslPolicyRead ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-05-14 16:52:33 +00:00
url , err := replaceVars ( d , config , "https://www.googleapis.com/compute/v1/projects/{{project}}/global/sslPolicies/{{name}}" )
2018-03-26 23:53:35 +00:00
if err != nil {
2018-05-14 16:52:33 +00:00
return err
2018-03-26 23:53:35 +00:00
}
2018-08-08 22:29:10 +00:00
res , err := sendRequest ( config , "GET" , url , nil )
2018-05-14 16:52:33 +00:00
if err != nil {
return handleNotFoundError ( err , d , fmt . Sprintf ( "ComputeSslPolicy %q" , d . Id ( ) ) )
}
2018-05-17 23:33:30 +00:00
2018-05-14 16:52:33 +00:00
if err := d . Set ( "creation_timestamp" , flattenComputeSslPolicyCreationTimestamp ( res [ "creationTimestamp" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "description" , flattenComputeSslPolicyDescription ( res [ "description" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "name" , flattenComputeSslPolicyName ( res [ "name" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "profile" , flattenComputeSslPolicyProfile ( res [ "profile" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "min_tls_version" , flattenComputeSslPolicyMinTlsVersion ( res [ "minTlsVersion" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "enabled_features" , flattenComputeSslPolicyEnabledFeatures ( res [ "enabledFeatures" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "custom_features" , flattenComputeSslPolicyCustomFeatures ( res [ "customFeatures" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
if err := d . Set ( "fingerprint" , flattenComputeSslPolicyFingerprint ( res [ "fingerprint" ] ) ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
2018-06-12 00:31:33 +00:00
if err := d . Set ( "self_link" , ConvertSelfLinkToV1 ( res [ "selfLink" ] . ( string ) ) ) ; err != nil {
2018-05-14 16:52:33 +00:00
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
2018-08-16 19:16:14 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
if err := d . Set ( "project" , project ) ; err != nil {
return fmt . Errorf ( "Error reading SslPolicy: %s" , err )
}
2018-03-26 23:53:35 +00:00
return nil
}
func resourceComputeSslPolicyUpdate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-06-19 20:56:06 +00:00
obj := make ( map [ string ] interface { } )
2018-05-14 16:52:33 +00:00
profileProp , err := expandComputeSslPolicyProfile ( d . Get ( "profile" ) , d , config )
if err != nil {
return err
2018-06-19 20:56:06 +00:00
} else if v , ok := d . GetOkExists ( "profile" ) ; ! isEmptyValue ( reflect . ValueOf ( v ) ) && ( ok || ! reflect . DeepEqual ( v , profileProp ) ) {
obj [ "profile" ] = profileProp
2018-05-14 16:52:33 +00:00
}
minTlsVersionProp , err := expandComputeSslPolicyMinTlsVersion ( d . Get ( "min_tls_version" ) , d , config )
if err != nil {
return err
2018-06-19 20:56:06 +00:00
} else if v , ok := d . GetOkExists ( "min_tls_version" ) ; ! isEmptyValue ( reflect . ValueOf ( v ) ) && ( ok || ! reflect . DeepEqual ( v , minTlsVersionProp ) ) {
obj [ "minTlsVersion" ] = minTlsVersionProp
2018-05-14 16:52:33 +00:00
}
customFeaturesProp , err := expandComputeSslPolicyCustomFeatures ( d . Get ( "custom_features" ) , d , config )
if err != nil {
return err
2018-06-19 20:56:06 +00:00
} else if v , ok := d . GetOkExists ( "custom_features" ) ; ! isEmptyValue ( reflect . ValueOf ( v ) ) && ( ok || ! reflect . DeepEqual ( v , customFeaturesProp ) ) {
obj [ "customFeatures" ] = customFeaturesProp
2018-03-26 23:53:35 +00:00
}
2018-05-14 16:52:33 +00:00
obj , err = resourceComputeSslPolicyUpdateEncoder ( d , meta , obj )
2018-07-12 19:51:11 +00:00
2018-05-14 16:52:33 +00:00
url , err := replaceVars ( d , config , "https://www.googleapis.com/compute/v1/projects/{{project}}/global/sslPolicies/{{name}}" )
if err != nil {
return err
2018-03-26 23:53:35 +00:00
}
2018-05-14 16:52:33 +00:00
log . Printf ( "[DEBUG] Updating SslPolicy %q: %#v" , d . Id ( ) , obj )
res , err := sendRequest ( config , "PATCH" , url , obj )
2018-03-26 23:53:35 +00:00
if err != nil {
2018-05-14 16:52:33 +00:00
return fmt . Errorf ( "Error updating SslPolicy %q: %s" , d . Id ( ) , err )
2018-03-26 23:53:35 +00:00
}
2018-08-16 19:16:14 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
op := & compute . Operation { }
err = Convert ( res , op )
if err != nil {
return err
}
err = computeOperationWaitTime (
config . clientCompute , op , project , "Updating SslPolicy" ,
int ( d . Timeout ( schema . TimeoutUpdate ) . Minutes ( ) ) )
2018-03-26 23:53:35 +00:00
if err != nil {
return err
}
return resourceComputeSslPolicyRead ( d , meta )
}
func resourceComputeSslPolicyDelete ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-05-14 16:52:33 +00:00
url , err := replaceVars ( d , config , "https://www.googleapis.com/compute/v1/projects/{{project}}/global/sslPolicies/{{name}}" )
if err != nil {
return err
}
2018-03-26 23:53:35 +00:00
2018-08-16 19:16:14 +00:00
var obj map [ string ] interface { }
2018-05-14 16:52:33 +00:00
log . Printf ( "[DEBUG] Deleting SslPolicy %q" , d . Id ( ) )
2018-08-16 19:16:14 +00:00
res , err := sendRequest ( config , "DELETE" , url , obj )
2018-03-26 23:53:35 +00:00
if err != nil {
2018-06-02 20:33:30 +00:00
return handleNotFoundError ( err , d , "SslPolicy" )
2018-03-26 23:53:35 +00:00
}
2018-08-16 19:16:14 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
op := & compute . Operation { }
err = Convert ( res , op )
2018-03-26 23:53:35 +00:00
if err != nil {
return err
}
2018-05-14 16:52:33 +00:00
err = computeOperationWaitTime (
config . clientCompute , op , project , "Deleting SslPolicy" ,
int ( d . Timeout ( schema . TimeoutDelete ) . Minutes ( ) ) )
if err != nil {
return err
}
2018-03-26 23:53:35 +00:00
2018-05-17 23:33:30 +00:00
log . Printf ( "[DEBUG] Finished deleting SslPolicy %q: %#v" , d . Id ( ) , res )
2018-03-26 23:53:35 +00:00
return nil
}
2018-05-14 16:52:33 +00:00
func resourceComputeSslPolicyImport ( d * schema . ResourceData , meta interface { } ) ( [ ] * schema . ResourceData , error ) {
config := meta . ( * Config )
parseImportId ( [ ] string { "projects/(?P<project>[^/]+)/global/sslPolicies/(?P<name>[^/]+)" , "(?P<project>[^/]+)/(?P<name>[^/]+)" , "(?P<name>[^/]+)" } , d , config )
// Replace import id for the resource id
id , err := replaceVars ( d , config , "{{name}}" )
if err != nil {
return nil , fmt . Errorf ( "Error constructing id: %s" , err )
}
d . SetId ( id )
return [ ] * schema . ResourceData { d } , nil
}
func flattenComputeSslPolicyCreationTimestamp ( v interface { } ) interface { } {
return v
}
func flattenComputeSslPolicyDescription ( v interface { } ) interface { } {
return v
}
func flattenComputeSslPolicyName ( v interface { } ) interface { } {
return v
}
func flattenComputeSslPolicyProfile ( v interface { } ) interface { } {
return v
}
func flattenComputeSslPolicyMinTlsVersion ( v interface { } ) interface { } {
return v
}
func flattenComputeSslPolicyEnabledFeatures ( v interface { } ) interface { } {
2018-08-15 20:46:55 +00:00
if v == nil {
return v
}
return schema . NewSet ( schema . HashString , v . ( [ ] interface { } ) )
2018-05-14 16:52:33 +00:00
}
func flattenComputeSslPolicyCustomFeatures ( v interface { } ) interface { } {
2018-08-15 20:46:55 +00:00
if v == nil {
return v
}
return schema . NewSet ( schema . HashString , v . ( [ ] interface { } ) )
2018-05-14 16:52:33 +00:00
}
func flattenComputeSslPolicyFingerprint ( v interface { } ) interface { } {
return v
}
func expandComputeSslPolicyDescription ( v interface { } , d * schema . ResourceData , config * Config ) ( interface { } , error ) {
return v , nil
}
func expandComputeSslPolicyName ( v interface { } , d * schema . ResourceData , config * Config ) ( interface { } , error ) {
return v , nil
}
func expandComputeSslPolicyProfile ( v interface { } , d * schema . ResourceData , config * Config ) ( interface { } , error ) {
return v , nil
}
func expandComputeSslPolicyMinTlsVersion ( v interface { } , d * schema . ResourceData , config * Config ) ( interface { } , error ) {
return v , nil
}
func expandComputeSslPolicyCustomFeatures ( v interface { } , d * schema . ResourceData , config * Config ) ( interface { } , error ) {
v = v . ( * schema . Set ) . List ( )
return v , nil
}
func resourceComputeSslPolicyUpdateEncoder ( d * schema . ResourceData , meta interface { } , obj map [ string ] interface { } ) ( map [ string ] interface { } , error ) {
// TODO(https://github.com/GoogleCloudPlatform/magic-modules/issues/184): Handle fingerprint consistently
obj [ "fingerprint" ] = d . Get ( "fingerprint" )
// TODO(https://github.com/GoogleCloudPlatform/magic-modules/issues/183): Can we generalize this
// Send a null fields if customFeatures is empty.
if v , ok := obj [ "customFeatures" ] ; ok && len ( v . ( [ ] interface { } ) ) == 0 {
obj [ "customFeatures" ] = nil
}
return obj , nil
}