@@ -68,6 +68,78 @@ func ResourceComputePerInstanceConfig() *schema.Resource {
6868 Elem : computePerInstanceConfigPreservedStateDiskSchema (),
6969 // Default schema.HashSchema is used.
7070 },
71+ "external_ip" : {
72+ Type : schema .TypeSet ,
73+ Optional : true ,
74+ Description : `Preserved external IPs defined for this instance. This map is keyed with the name of the network interface.` ,
75+ Elem : & schema.Resource {
76+ Schema : map [string ]* schema.Schema {
77+ "interface_name" : {
78+ Type : schema .TypeString ,
79+ Required : true ,
80+ },
81+ "auto_delete" : {
82+ Type : schema .TypeString ,
83+ Optional : true ,
84+ ValidateFunc : validateEnum ([]string {"NEVER" , "ON_PERMANENT_INSTANCE_DELETION" , "" }),
85+ Description : `These stateful IPs will never be released during autohealing, update or VM instance recreate operations. This flag is used to configure if the IP reservation should be deleted after it is no longer used by the group, e.g. when the given instance or the whole group is deleted. Default value: "NEVER" Possible values: ["NEVER", "ON_PERMANENT_INSTANCE_DELETION"]` ,
86+ Default : "NEVER" ,
87+ },
88+ "ip_address" : {
89+ Type : schema .TypeList ,
90+ Optional : true ,
91+ Description : `Ip address representation` ,
92+ MaxItems : 1 ,
93+ Elem : & schema.Resource {
94+ Schema : map [string ]* schema.Schema {
95+ "address" : {
96+ Type : schema .TypeString ,
97+ Optional : true ,
98+ DiffSuppressFunc : compareSelfLinkOrResourceName ,
99+ Description : `The URL of the reservation for this IP address.` ,
100+ },
101+ },
102+ },
103+ },
104+ },
105+ },
106+ },
107+ "internal_ip" : {
108+ Type : schema .TypeSet ,
109+ Optional : true ,
110+ Description : `Preserved internal IPs defined for this instance. This map is keyed with the name of the network interface.` ,
111+ Elem : & schema.Resource {
112+ Schema : map [string ]* schema.Schema {
113+ "interface_name" : {
114+ Type : schema .TypeString ,
115+ Required : true ,
116+ },
117+ "auto_delete" : {
118+ Type : schema .TypeString ,
119+ Optional : true ,
120+ ValidateFunc : validateEnum ([]string {"NEVER" , "ON_PERMANENT_INSTANCE_DELETION" , "" }),
121+ Description : `These stateful IPs will never be released during autohealing, update or VM instance recreate operations. This flag is used to configure if the IP reservation should be deleted after it is no longer used by the group, e.g. when the given instance or the whole group is deleted. Default value: "NEVER" Possible values: ["NEVER", "ON_PERMANENT_INSTANCE_DELETION"]` ,
122+ Default : "NEVER" ,
123+ },
124+ "ip_address" : {
125+ Type : schema .TypeList ,
126+ Optional : true ,
127+ Description : `Ip address representation` ,
128+ MaxItems : 1 ,
129+ Elem : & schema.Resource {
130+ Schema : map [string ]* schema.Schema {
131+ "address" : {
132+ Type : schema .TypeString ,
133+ Optional : true ,
134+ DiffSuppressFunc : compareSelfLinkOrResourceName ,
135+ Description : `The URL of the reservation for this IP address.` ,
136+ },
137+ },
138+ },
139+ },
140+ },
141+ },
142+ },
71143 "metadata" : {
72144 Type : schema .TypeMap ,
73145 Optional : true ,
@@ -558,6 +630,10 @@ func flattenNestedComputePerInstanceConfigPreservedState(v interface{}, d *schem
558630 flattenNestedComputePerInstanceConfigPreservedStateMetadata (original ["metadata" ], d , config )
559631 transformed ["disk" ] =
560632 flattenNestedComputePerInstanceConfigPreservedStateDisk (original ["disks" ], d , config )
633+ transformed ["internal_ip" ] =
634+ flattenNestedComputePerInstanceConfigPreservedStateInternalIp (original ["internalIPs" ], d , config )
635+ transformed ["external_ip" ] =
636+ flattenNestedComputePerInstanceConfigPreservedStateExternalIp (original ["externalIPs" ], d , config )
561637 return []interface {}{transformed }
562638}
563639func flattenNestedComputePerInstanceConfigPreservedStateMetadata (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
@@ -586,6 +662,86 @@ func flattenNestedComputePerInstanceConfigPreservedStateDisk(v interface{}, d *s
586662 return transformed
587663}
588664
665+ func flattenNestedComputePerInstanceConfigPreservedStateInternalIp (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
666+ if v == nil {
667+ return v
668+ }
669+ l := v .(map [string ]interface {})
670+ transformed := make ([]interface {}, 0 , len (l ))
671+ for k , raw := range l {
672+ original := raw .(map [string ]interface {})
673+ transformed = append (transformed , map [string ]interface {}{
674+ "interface_name" : k ,
675+ "auto_delete" : flattenNestedComputePerInstanceConfigPreservedStateInternalIpAutoDelete (original ["autoDelete" ], d , config ),
676+ "ip_address" : flattenNestedComputePerInstanceConfigPreservedStateInternalIpIpAddress (original ["ipAddress" ], d , config ),
677+ })
678+ }
679+ return transformed
680+ }
681+ func flattenNestedComputePerInstanceConfigPreservedStateInternalIpAutoDelete (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
682+ return v
683+ }
684+
685+ func flattenNestedComputePerInstanceConfigPreservedStateInternalIpIpAddress (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
686+ if v == nil {
687+ return nil
688+ }
689+ original := v .(map [string ]interface {})
690+ if len (original ) == 0 {
691+ return nil
692+ }
693+ transformed := make (map [string ]interface {})
694+ transformed ["address" ] =
695+ flattenNestedComputePerInstanceConfigPreservedStateInternalIpIpAddressAddress (original ["address" ], d , config )
696+ return []interface {}{transformed }
697+ }
698+ func flattenNestedComputePerInstanceConfigPreservedStateInternalIpIpAddressAddress (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
699+ if v == nil {
700+ return v
701+ }
702+ return ConvertSelfLinkToV1 (v .(string ))
703+ }
704+
705+ func flattenNestedComputePerInstanceConfigPreservedStateExternalIp (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
706+ if v == nil {
707+ return v
708+ }
709+ l := v .(map [string ]interface {})
710+ transformed := make ([]interface {}, 0 , len (l ))
711+ for k , raw := range l {
712+ original := raw .(map [string ]interface {})
713+ transformed = append (transformed , map [string ]interface {}{
714+ "interface_name" : k ,
715+ "auto_delete" : flattenNestedComputePerInstanceConfigPreservedStateExternalIpAutoDelete (original ["autoDelete" ], d , config ),
716+ "ip_address" : flattenNestedComputePerInstanceConfigPreservedStateExternalIpIpAddress (original ["ipAddress" ], d , config ),
717+ })
718+ }
719+ return transformed
720+ }
721+ func flattenNestedComputePerInstanceConfigPreservedStateExternalIpAutoDelete (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
722+ return v
723+ }
724+
725+ func flattenNestedComputePerInstanceConfigPreservedStateExternalIpIpAddress (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
726+ if v == nil {
727+ return nil
728+ }
729+ original := v .(map [string ]interface {})
730+ if len (original ) == 0 {
731+ return nil
732+ }
733+ transformed := make (map [string ]interface {})
734+ transformed ["address" ] =
735+ flattenNestedComputePerInstanceConfigPreservedStateExternalIpIpAddressAddress (original ["address" ], d , config )
736+ return []interface {}{transformed }
737+ }
738+ func flattenNestedComputePerInstanceConfigPreservedStateExternalIpIpAddressAddress (v interface {}, d * schema.ResourceData , config * Config ) interface {} {
739+ if v == nil {
740+ return v
741+ }
742+ return ConvertSelfLinkToV1 (v .(string ))
743+ }
744+
589745func expandNestedComputePerInstanceConfigName (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
590746 return v , nil
591747}
@@ -613,6 +769,20 @@ func expandNestedComputePerInstanceConfigPreservedState(v interface{}, d Terrafo
613769 transformed ["disks" ] = transformedDisk
614770 }
615771
772+ transformedInternalIp , err := expandNestedComputePerInstanceConfigPreservedStateInternalIp (original ["internal_ip" ], d , config )
773+ if err != nil {
774+ return nil , err
775+ } else if val := reflect .ValueOf (transformedInternalIp ); val .IsValid () && ! isEmptyValue (val ) {
776+ transformed ["internalIPs" ] = transformedInternalIp
777+ }
778+
779+ transformedExternalIp , err := expandNestedComputePerInstanceConfigPreservedStateExternalIp (original ["external_ip" ], d , config )
780+ if err != nil {
781+ return nil , err
782+ } else if val := reflect .ValueOf (transformedExternalIp ); val .IsValid () && ! isEmptyValue (val ) {
783+ transformed ["externalIPs" ] = transformedExternalIp
784+ }
785+
616786 return transformed , nil
617787}
618788
@@ -657,6 +827,132 @@ func expandNestedComputePerInstanceConfigPreservedStateDisk(v interface{}, d Ter
657827 return req , nil
658828}
659829
830+ func expandNestedComputePerInstanceConfigPreservedStateInternalIp (v interface {}, d TerraformResourceData , config * Config ) (map [string ]interface {}, error ) {
831+ if v == nil {
832+ return map [string ]interface {}{}, nil
833+ }
834+ m := make (map [string ]interface {})
835+ for _ , raw := range v .(* schema.Set ).List () {
836+ original := raw .(map [string ]interface {})
837+ transformed := make (map [string ]interface {})
838+
839+ transformedAutoDelete , err := expandNestedComputePerInstanceConfigPreservedStateInternalIpAutoDelete (original ["auto_delete" ], d , config )
840+ if err != nil {
841+ return nil , err
842+ } else if val := reflect .ValueOf (transformedAutoDelete ); val .IsValid () && ! isEmptyValue (val ) {
843+ transformed ["autoDelete" ] = transformedAutoDelete
844+ }
845+
846+ transformedIpAddress , err := expandNestedComputePerInstanceConfigPreservedStateInternalIpIpAddress (original ["ip_address" ], d , config )
847+ if err != nil {
848+ return nil , err
849+ } else if val := reflect .ValueOf (transformedIpAddress ); val .IsValid () && ! isEmptyValue (val ) {
850+ transformed ["ipAddress" ] = transformedIpAddress
851+ }
852+
853+ transformedInterfaceName , err := expandString (original ["interface_name" ], d , config )
854+ if err != nil {
855+ return nil , err
856+ }
857+ m [transformedInterfaceName ] = transformed
858+ }
859+ return m , nil
860+ }
861+
862+ func expandNestedComputePerInstanceConfigPreservedStateInternalIpAutoDelete (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
863+ return v , nil
864+ }
865+
866+ func expandNestedComputePerInstanceConfigPreservedStateInternalIpIpAddress (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
867+ l := v .([]interface {})
868+ if len (l ) == 0 || l [0 ] == nil {
869+ return nil , nil
870+ }
871+ raw := l [0 ]
872+ original := raw .(map [string ]interface {})
873+ transformed := make (map [string ]interface {})
874+
875+ transformedAddress , err := expandNestedComputePerInstanceConfigPreservedStateInternalIpIpAddressAddress (original ["address" ], d , config )
876+ if err != nil {
877+ return nil , err
878+ } else if val := reflect .ValueOf (transformedAddress ); val .IsValid () && ! isEmptyValue (val ) {
879+ transformed ["address" ] = transformedAddress
880+ }
881+
882+ return transformed , nil
883+ }
884+
885+ func expandNestedComputePerInstanceConfigPreservedStateInternalIpIpAddressAddress (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
886+ f , err := parseRegionalFieldValue ("addresses" , v .(string ), "project" , "region" , "zone" , d , config , true )
887+ if err != nil {
888+ return nil , fmt .Errorf ("Invalid value for address: %s" , err )
889+ }
890+ return f .RelativeLink (), nil
891+ }
892+
893+ func expandNestedComputePerInstanceConfigPreservedStateExternalIp (v interface {}, d TerraformResourceData , config * Config ) (map [string ]interface {}, error ) {
894+ if v == nil {
895+ return map [string ]interface {}{}, nil
896+ }
897+ m := make (map [string ]interface {})
898+ for _ , raw := range v .(* schema.Set ).List () {
899+ original := raw .(map [string ]interface {})
900+ transformed := make (map [string ]interface {})
901+
902+ transformedAutoDelete , err := expandNestedComputePerInstanceConfigPreservedStateExternalIpAutoDelete (original ["auto_delete" ], d , config )
903+ if err != nil {
904+ return nil , err
905+ } else if val := reflect .ValueOf (transformedAutoDelete ); val .IsValid () && ! isEmptyValue (val ) {
906+ transformed ["autoDelete" ] = transformedAutoDelete
907+ }
908+
909+ transformedIpAddress , err := expandNestedComputePerInstanceConfigPreservedStateExternalIpIpAddress (original ["ip_address" ], d , config )
910+ if err != nil {
911+ return nil , err
912+ } else if val := reflect .ValueOf (transformedIpAddress ); val .IsValid () && ! isEmptyValue (val ) {
913+ transformed ["ipAddress" ] = transformedIpAddress
914+ }
915+
916+ transformedInterfaceName , err := expandString (original ["interface_name" ], d , config )
917+ if err != nil {
918+ return nil , err
919+ }
920+ m [transformedInterfaceName ] = transformed
921+ }
922+ return m , nil
923+ }
924+
925+ func expandNestedComputePerInstanceConfigPreservedStateExternalIpAutoDelete (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
926+ return v , nil
927+ }
928+
929+ func expandNestedComputePerInstanceConfigPreservedStateExternalIpIpAddress (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
930+ l := v .([]interface {})
931+ if len (l ) == 0 || l [0 ] == nil {
932+ return nil , nil
933+ }
934+ raw := l [0 ]
935+ original := raw .(map [string ]interface {})
936+ transformed := make (map [string ]interface {})
937+
938+ transformedAddress , err := expandNestedComputePerInstanceConfigPreservedStateExternalIpIpAddressAddress (original ["address" ], d , config )
939+ if err != nil {
940+ return nil , err
941+ } else if val := reflect .ValueOf (transformedAddress ); val .IsValid () && ! isEmptyValue (val ) {
942+ transformed ["address" ] = transformedAddress
943+ }
944+
945+ return transformed , nil
946+ }
947+
948+ func expandNestedComputePerInstanceConfigPreservedStateExternalIpIpAddressAddress (v interface {}, d TerraformResourceData , config * Config ) (interface {}, error ) {
949+ f , err := parseRegionalFieldValue ("addresses" , v .(string ), "project" , "region" , "zone" , d , config , true )
950+ if err != nil {
951+ return nil , fmt .Errorf ("Invalid value for address: %s" , err )
952+ }
953+ return f .RelativeLink (), nil
954+ }
955+
660956func resourceComputePerInstanceConfigEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
661957 wrappedReq := map [string ]interface {}{
662958 "instances" : []interface {}{obj },
0 commit comments