func (d *Dispatcher) createBridgeNetwork(conf *config.VirtualContainerHostConfigSpec) error { defer trace.End(trace.Begin("")) // if the bridge network is already extant there's nothing to do bnet := conf.ExecutorConfig.Networks[conf.BridgeNetwork] if bnet != nil && bnet.ID != "" { return nil } // network didn't exist during validation given we don't have a moref, so create it if d.session.Client.IsVC() { // double check return errors.New("bridge network must already exist for vCenter environments") } // in this case the name to use is held in container network ID name := bnet.Network.ID log.Infof("Creating VirtualSwitch") hostNetSystem, err := d.session.Host.ConfigManager().NetworkSystem(d.ctx) if err != nil { err = errors.Errorf("Failed to retrieve host network system: %s", err) return err } if err = hostNetSystem.AddVirtualSwitch(d.ctx, name, &types.HostVirtualSwitchSpec{ NumPorts: 1024, }); err != nil { err = errors.Errorf("Failed to add virtual switch (%q): %s", name, err) return err } log.Infof("Creating Portgroup") if err = hostNetSystem.AddPortGroup(d.ctx, types.HostPortGroupSpec{ Name: name, VlanId: 1, // TODO: expose this for finer grained grouping within the switch VswitchName: name, Policy: types.HostNetworkPolicy{}, }); err != nil { err = errors.Errorf("Failed to add port group (%q): %s", name, err) return err } net, err := d.session.Finder.Network(d.ctx, name) if err != nil { _, ok := err.(*find.NotFoundError) if !ok { err = errors.Errorf("Failed to query virtual switch (%q): %s", name, err) return err } } // assign the moref to the bridge network config on the appliance bnet.ID = net.Reference().String() bnet.Network.ID = net.Reference().String() conf.CreateBridgeNetwork = true return nil }