func (sv *supervisor) updateWorker(IP string, leaderIP string, etcdIPs []string) { if !reflect.DeepEqual(sv.etcdIPs, etcdIPs) { sv.Remove(Etcd) } sv.run(Etcd, fmt.Sprintf("--initial-cluster=%s", initialClusterString(etcdIPs)), "--heartbeat-interval="+etcdHeartbeatInterval, "--election-timeout="+etcdElectionTimeout, "--proxy=on") sv.run(Ovsdb, "ovsdb-server") sv.run(Ovsvswitchd, "ovs-vswitchd") if leaderIP == "" || IP == "" { return } gwMac := ipdef.IPToMac(ipdef.GatewayIP) err := execRun("ovs-vsctl", "set", "Open_vSwitch", ".", fmt.Sprintf("external_ids:ovn-remote=\"tcp:%s:6640\"", leaderIP), fmt.Sprintf("external_ids:ovn-encap-ip=%s", IP), fmt.Sprintf("external_ids:ovn-encap-type=\"%s\"", tunnelingProtocol), fmt.Sprintf("external_ids:api_server=\"http://%s:9000\"", leaderIP), fmt.Sprintf("external_ids:system-id=\"%s\"", IP), "--", "add-br", "quilt-int", "--", "set", "bridge", "quilt-int", "fail_mode=secure", fmt.Sprintf("other_config:hwaddr=\"%s\"", gwMac)) if err != nil { log.WithError(err).Warnf("Failed to exec in %s.", Ovsvswitchd) return } err = execRun("ip", "link", "set", "dev", "quilt-int", "up") if err != nil { log.WithError(err).Warnf("Failed to bring up quilt-int") return } ip := net.IPNet{IP: ipdef.GatewayIP, Mask: ipdef.QuiltSubnet.Mask} err = execRun("ip", "addr", "add", ip.String(), "dev", "quilt-int") if err != nil { log.WithError(err).Warnf("Failed to set quilt-int IP") return } /* The ovn controller doesn't support reconfiguring ovn-remote mid-run. * So, we need to restart the container when the leader changes. */ sv.Remove(Ovncontroller) sv.run(Ovncontroller, "ovn-controller") sv.SetInit(true) }
// CreateEndpoint acknowledges the request, but does not actually do anything. func (d driver) CreateEndpoint(req *dnet.CreateEndpointRequest) ( *dnet.CreateEndpointResponse, error) { addr, _, err := net.ParseCIDR(req.Interface.Address) if err != nil { return nil, fmt.Errorf("invalid IP: %s", req.Interface.Address) } mac := req.Interface.MacAddress if mac != "" { return nil, fmt.Errorf("expected no mac in request, got mac=%s", mac) } if err := expectNoEndpoint(req.EndpointID); err != nil { return nil, err } resp := &dnet.CreateEndpointResponse{ Interface: &dnet.EndpointInterface{ MacAddress: ipdef.IPToMac(addr), }, } return resp, nil }