55 "fmt"
66 "log"
77 "sort"
8+ "strings"
89
910 "github.com/hashicorp/terraform/helper/hashcode"
1011 "github.com/hashicorp/terraform/helper/schema"
@@ -18,6 +19,10 @@ func resourceComputeFirewall() *schema.Resource {
1819 Read : resourceComputeFirewallRead ,
1920 Update : resourceComputeFirewallUpdate ,
2021 Delete : resourceComputeFirewallDelete ,
22+ Importer : & schema.ResourceImporter {
23+ State : schema .ImportStatePassthrough ,
24+ },
25+ SchemaVersion : 1 ,
2126
2227 Schema : map [string ]* schema.Schema {
2328 "name" : & schema.Schema {
@@ -43,10 +48,9 @@ func resourceComputeFirewall() *schema.Resource {
4348 },
4449
4550 "ports" : & schema.Schema {
46- Type : schema .TypeSet ,
51+ Type : schema .TypeList ,
4752 Optional : true ,
4853 Elem : & schema.Schema {Type : schema .TypeString },
49- Set : schema .HashString ,
5054 },
5155 },
5256 },
@@ -62,6 +66,7 @@ func resourceComputeFirewall() *schema.Resource {
6266 Type : schema .TypeString ,
6367 Optional : true ,
6468 ForceNew : true ,
69+ Computed : true ,
6570 },
6671
6772 "self_link" : & schema.Schema {
@@ -101,11 +106,7 @@ func resourceComputeFirewallAllowHash(v interface{}) int {
101106 // We need to make sure to sort the strings below so that we always
102107 // generate the same hash code no matter what is in the set.
103108 if v , ok := m ["ports" ]; ok {
104- vs := v .(* schema.Set ).List ()
105- s := make ([]string , len (vs ))
106- for i , raw := range vs {
107- s [i ] = raw .(string )
108- }
109+ s := convertStringArr (v .([]interface {}))
109110 sort .Strings (s )
110111
111112 for _ , v := range s {
@@ -146,6 +147,18 @@ func resourceComputeFirewallCreate(d *schema.ResourceData, meta interface{}) err
146147 return resourceComputeFirewallRead (d , meta )
147148}
148149
150+ func flattenAllowed (allowed []* compute.FirewallAllowed ) []map [string ]interface {} {
151+ result := make ([]map [string ]interface {}, 0 , len (allowed ))
152+ for _ , allow := range allowed {
153+ allowMap := make (map [string ]interface {})
154+ allowMap ["protocol" ] = allow .IPProtocol
155+ allowMap ["ports" ] = allow .Ports
156+
157+ result = append (result , allowMap )
158+ }
159+ return result
160+ }
161+
149162func resourceComputeFirewallRead (d * schema.ResourceData , meta interface {}) error {
150163 config := meta .(* Config )
151164
@@ -168,8 +181,16 @@ func resourceComputeFirewallRead(d *schema.ResourceData, meta interface{}) error
168181 return fmt .Errorf ("Error reading firewall: %s" , err )
169182 }
170183
184+ networkUrl := strings .Split (firewall .Network , "/" )
171185 d .Set ("self_link" , firewall .SelfLink )
172-
186+ d .Set ("name" , firewall .Name )
187+ d .Set ("network" , networkUrl [len (networkUrl )- 1 ])
188+ d .Set ("description" , firewall .Description )
189+ d .Set ("project" , project )
190+ d .Set ("source_ranges" , firewall .SourceRanges )
191+ d .Set ("source_tags" , firewall .SourceTags )
192+ d .Set ("target_tags" , firewall .TargetTags )
193+ d .Set ("allow" , flattenAllowed (firewall .Allowed ))
173194 return nil
174195}
175196
@@ -250,10 +271,10 @@ func resourceFirewall(
250271 m := v .(map [string ]interface {})
251272
252273 var ports []string
253- if v := m ["ports" ].(* schema. Set ); v . Len ( ) > 0 {
254- ports = make ([]string , v . Len ( ))
255- for i , v := range v . List () {
256- ports [i ] = v .( string )
274+ if v := convertStringArr ( m ["ports" ].([] interface {})); len ( v ) > 0 {
275+ ports = make ([]string , len ( v ))
276+ for i , v := range v {
277+ ports [i ] = v
257278 }
258279 }
259280
0 commit comments