gce: allow network to be marked as shared

This commit is contained in:
justinsb 2021-10-23 23:54:39 -04:00
parent 93b94be3f3
commit 860b033ddc
5 changed files with 43 additions and 7 deletions

View File

@ -39,6 +39,7 @@ func (b *NetworkModelBuilder) Build(c *fi.ModelBuilderContext) error {
Lifecycle: b.Lifecycle,
Mode: "auto", // Automatically create subnets, but stop using legacy mode
}
network.Shared = fi.Bool(b.NameForNetwork() == "default")
c.AddTask(network)
if gce.UsesIPAliases(b.Cluster) {

View File

@ -257,8 +257,7 @@ func (_ *FirewallRule) RenderTerraform(t *terraform.TerraformTarget, a, e, chang
Disabled: g.Disabled,
}
// TODO: This doesn't seem right, but it looks like a TF problem
tf.Network = e.Network.TerraformName()
tf.Network = e.Network.TerraformLink()
return t.RenderResource("google_compute_firewall", *e.Name, tf)
}

View File

@ -501,7 +501,7 @@ func addNetworks(network *Network, subnet *Subnet, networkInterfaces []*compute.
for _, g := range networkInterfaces {
tf := &terraformNetworkInterface{}
if network != nil {
tf.Network = network.TerraformName()
tf.Network = network.TerraformLink()
}
if subnet != nil {
tf.Subnetwork = subnet.TerraformName()

View File

@ -35,6 +35,8 @@ type Network struct {
Mode string
CIDR *string
Shared *bool
}
var _ fi.CompareWithID = &Network{}
@ -71,6 +73,13 @@ func (e *Network) Find(c *fi.Context) (*Network, error) {
// Ignore "system" fields
actual.Lifecycle = e.Lifecycle
actual.Shared = e.Shared
actual.Name = e.Name
// Match unspecified values
if e.Mode == "" {
e.Mode = actual.Mode
}
return actual, nil
}
@ -117,6 +126,14 @@ func (_ *Network) CheckChanges(a, e, changes *Network) error {
}
func (_ *Network) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Network) error {
shared := fi.BoolValue(e.Shared)
if shared {
// Verify the network was found
if a == nil {
return fmt.Errorf("Network with name %q not found", fi.StringValue(e.Name))
}
}
if a == nil {
klog.V(2).Infof("Creating Network with CIDR: %q", fi.StringValue(e.CIDR))
@ -139,10 +156,13 @@ func (_ *Network) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Network) error {
// the default value.
network.ForceSendFields = []string{"AutoCreateSubnetworks"}
}
_, err := t.Cloud.Compute().Networks().Insert(t.Cloud.Project(), network)
op, err := t.Cloud.Compute().Networks().Insert(t.Cloud.Project(), network)
if err != nil {
return fmt.Errorf("error creating Network: %v", err)
}
if err := t.Cloud.WaitForOp(op); err != nil {
return fmt.Errorf("error waiting for Network creation to complete: %w", err)
}
} else {
if a.Mode == "legacy" {
return fmt.Errorf("GCE networks in legacy mode are not supported. Please convert to auto mode or specify a different network.")
@ -163,6 +183,12 @@ type terraformNetwork struct {
}
func (_ *Network) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Network) error {
shared := fi.BoolValue(e.Shared)
if shared {
// Not terraform owned / managed
return nil
}
tf := &terraformNetwork{
Name: e.Name,
}
@ -181,6 +207,16 @@ func (_ *Network) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *N
return t.RenderResource("google_compute_network", *e.Name, tf)
}
func (i *Network) TerraformName() *terraformWriter.Literal {
return terraformWriter.LiteralProperty("google_compute_network", *i.Name, "name")
func (e *Network) TerraformLink() *terraformWriter.Literal {
shared := fi.BoolValue(e.Shared)
if shared {
if e.Name == nil {
klog.Fatalf("Name must be set, if network is shared: %#v", e)
}
klog.V(4).Infof("reusing existing network with name %q", *e.Name)
return terraformWriter.LiteralFromStringValue(*e.Name)
}
return terraformWriter.LiteralProperty("google_compute_network", *e.Name, "name")
}

View File

@ -220,7 +220,7 @@ type terraformSubnetRange struct {
func (_ *Subnet) RenderSubnet(t *terraform.TerraformTarget, a, e, changes *Subnet) error {
tf := &terraformSubnet{
Name: e.GCEName,
Network: e.Network.TerraformName(),
Network: e.Network.TerraformLink(),
Region: e.Region,
CIDR: e.CIDR,
}