// NetworkDelete deletes network func (ac *APIController) NetworkDelete(network *contivModel.Network) error { log.Infof("Received NetworkDelete: %+v", network) // Find the tenant tenant := contivModel.FindTenant(network.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Remove link modeldb.RemoveLinkSet(&tenant.LinkSets.Networks, network) // Save the tenant too since we removed the links err := tenant.Write() if err != nil { return err } // Get the state driver stateDriver, err := utils.GetStateDriver() if err != nil { return err } // Delete the network networkID := network.NetworkName + "." + network.TenantName err = master.DeleteNetworkID(stateDriver, networkID) if err != nil { log.Errorf("Error deleting network %s. Err: %v", network.NetworkName, err) } return nil }
// AppCreate creates app state func (ac *APIController) AppCreate(app *contivModel.App) error { log.Infof("Received AppCreate: %+v", app) // Make sure tenant exists if app.TenantName == "" { return core.Errorf("Invalid tenant name") } tenant := contivModel.FindTenant(app.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Setup links modeldb.AddLink(&app.Links.Tenant, tenant) modeldb.AddLinkSet(&tenant.LinkSets.Apps, app) // Save the tenant too since we added the links err := tenant.Write() if err != nil { log.Errorf("Error updating tenant state(%+v). Err: %v", tenant, err) return err } CreateAppNw(app) return nil }
// VolumeCreate creates a volume func (ac *APIController) VolumeCreate(volume *contivModel.Volume) error { log.Infof("Received VolumeCreate: %+v", volume) // Make sure tenant exists if volume.TenantName == "" { return errors.New("Invalid tenant name") } tenant := contivModel.FindTenant(volume.TenantName) if tenant == nil { return errors.New("Tenant not found") } // Setup links modeldb.AddLink(&volume.Links.Tenant, tenant) modeldb.AddLinkSet(&tenant.LinkSets.Volumes, volume) // Save the tenant too since we added the links err := tenant.Write() if err != nil { return err } return nil }
func (self *ApiController) NetworkCreate(network *contivModel.Network) error { log.Infof("Received NetworkCreate: %+v", network) // Make sure tenant exists if network.TenantName == "" { return errors.New("Invalid tenant name") } tenant := contivModel.FindTenant(network.TenantName) if tenant == nil { return errors.New("Tenant not found") } // Setup links modeldb.AddLink(&network.Links.Tenant, tenant) modeldb.AddLinkSet(&tenant.LinkSets.Networks, network) // Save the tenant too since we added the links err := tenant.Write() if err != nil { log.Errorf("Error updating tenant state(%+v). Err: %v", tenant, err) return err } return nil }
// EndpointGroupCreate creates end point group func (ac *APIController) EndpointGroupCreate(endpointGroup *contivModel.EndpointGroup) error { log.Infof("Received EndpointGroupCreate: %+v", endpointGroup) // assign unique endpoint group ids endpointGroup.EndpointGroupID = globalEpgID globalEpgID = globalEpgID + 1 // Find the tenant tenant := contivModel.FindTenant(endpointGroup.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Setup links modeldb.AddLink(&endpointGroup.Links.Tenant, tenant) modeldb.AddLinkSet(&tenant.LinkSets.EndpointGroups, endpointGroup) // Save the tenant too since we added the links err := tenant.Write() if err != nil { return err } // for each policy create an epg policy Instance for _, policyName := range endpointGroup.Policies { policyKey := endpointGroup.TenantName + ":" + policyName // find the policy policy := contivModel.FindPolicy(policyKey) if policy == nil { log.Errorf("Could not find policy %s", policyName) return core.Errorf("Policy not found") } // attach policy to epg err = master.PolicyAttach(endpointGroup, policy) if err != nil { log.Errorf("Error attaching policy %s to epg %s", policyName, endpointGroup.Key) return err } // establish Links modeldb.AddLinkSet(&policy.LinkSets.EndpointGroups, endpointGroup) modeldb.AddLinkSet(&endpointGroup.LinkSets.Policies, policy) // Write the policy err = policy.Write() if err != nil { return err } } return nil }
// NetworkCreate creates network func (ac *APIController) NetworkCreate(network *contivModel.Network) error { log.Infof("Received NetworkCreate: %+v", network) // Make sure tenant exists if network.TenantName == "" { return core.Errorf("Invalid tenant name") } tenant := contivModel.FindTenant(network.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Setup links modeldb.AddLink(&network.Links.Tenant, tenant) modeldb.AddLinkSet(&tenant.LinkSets.Networks, network) // Save the tenant too since we added the links err := tenant.Write() if err != nil { log.Errorf("Error updating tenant state(%+v). Err: %v", tenant, err) return err } // Get the state driver stateDriver, err := utils.GetStateDriver() if err != nil { return err } // Build networ config networkCfg := intent.ConfigNetwork{ Name: network.NetworkName, PktTagType: network.Encap, PktTag: network.PktTag, SubnetCIDR: network.Subnet, Gateway: network.Gateway, } // Create the network err = master.CreateNetwork(networkCfg, stateDriver, network.TenantName) if err != nil { log.Errorf("Error creating network {%+v}. Err: %v", network, err) return err } return nil }
// NewAPIController creates a new controller func NewAPIController(router *mux.Router) *APIController { ctrler := new(APIController) ctrler.router = router // initialize the model objects contivModel.Init() // Register Callbacks contivModel.RegisterAppCallbacks(ctrler) contivModel.RegisterEndpointGroupCallbacks(ctrler) contivModel.RegisterNetworkCallbacks(ctrler) contivModel.RegisterPolicyCallbacks(ctrler) contivModel.RegisterRuleCallbacks(ctrler) contivModel.RegisterServiceCallbacks(ctrler) contivModel.RegisterServiceInstanceCallbacks(ctrler) contivModel.RegisterTenantCallbacks(ctrler) contivModel.RegisterVolumeCallbacks(ctrler) contivModel.RegisterVolumeProfileCallbacks(ctrler) // Register routes contivModel.AddRoutes(router) // Add default tenant if it doesnt exist tenant := contivModel.FindTenant("default") if tenant == nil { log.Infof("Creating default tenant") err := contivModel.CreateTenant(&contivModel.Tenant{ Key: "default", TenantName: "default", SubnetPool: "10.1.1.1/16", SubnetLen: 24, Vlans: "100-200", Vxlans: "1001-1100", }) if err != nil { log.Fatalf("Error creating default tenant. Err: %v", err) } } return ctrler }
// CreateDefaultTenant creates the default tenant func CreateDefaultTenant() { // Wait for netmaster to start listening to port 9999 time.Sleep(time.Second) // Add default tenant if it doesnt exist tenant := contivModel.FindTenant("default") if tenant == nil { log.Infof("Creating default tenant") err := contivModel.CreateTenant(&contivModel.Tenant{ Key: "default", TenantName: "default", SubnetPool: "10.1.1.1/16", SubnetLen: 24, Vlans: "100-1100", Vxlans: "1001-1100", }) if err != nil { log.Fatalf("Error creating default tenant. Err: %v", err) } } }
// ServiceCreate creates service func (ac *APIController) ServiceCreate(service *contivModel.Service) error { log.Infof("Received ServiceCreate: %+v", service) // check params if (service.TenantName == "") || (service.AppName == "") { return core.Errorf("Invalid parameters") } // Make sure tenant exists tenant := contivModel.FindTenant(service.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Find the app this service belongs to app := contivModel.FindApp(service.TenantName + ":" + service.AppName) if app == nil { return core.Errorf("App not found") } // Setup links modeldb.AddLink(&service.Links.App, app) modeldb.AddLinkSet(&app.LinkSets.Services, service) // Save the app too since we added the links err := app.Write() if err != nil { return err } // Check if user specified any networks if len(service.Networks) == 0 { service.Networks = append(service.Networks, "private") } // link service with network for _, netName := range service.Networks { netKey := service.TenantName + ":" + netName network := contivModel.FindNetwork(netKey) if network == nil { log.Errorf("Service: %s could not find network %s", service.Key, netKey) return core.Errorf("Network not found") } // Link the network modeldb.AddLinkSet(&service.LinkSets.Networks, network) modeldb.AddLinkSet(&network.LinkSets.Services, service) // save the network err := network.Write() if err != nil { return err } } // Check if user specified any endpoint group for the service if len(service.EndpointGroups) == 0 { // Create one default endpointGroup per network for _, netName := range service.Networks { // params for default endpoint group dfltEpgName := service.AppName + "." + service.ServiceName + "." + netName endpointGroup := contivModel.EndpointGroup{ Key: service.TenantName + ":" + dfltEpgName, TenantName: service.TenantName, NetworkName: netName, GroupName: dfltEpgName, } // Create default endpoint group for the service err = contivModel.CreateEndpointGroup(&endpointGroup) if err != nil { log.Errorf("Error creating endpoint group: %+v, Err: %v", endpointGroup, err) return err } // Add the endpoint group to the list service.EndpointGroups = append(service.EndpointGroups, dfltEpgName) } } // Link the service and endpoint group for _, epgName := range service.EndpointGroups { endpointGroup := contivModel.FindEndpointGroup(service.TenantName + ":" + epgName) if endpointGroup == nil { log.Errorf("Error: could not find endpoint group: %s", epgName) return core.Errorf("could not find endpointGroup") } // setup links modeldb.AddLinkSet(&service.LinkSets.EndpointGroups, endpointGroup) modeldb.AddLinkSet(&endpointGroup.LinkSets.Services, service) // save the endpointGroup err = endpointGroup.Write() if err != nil { return err } } return nil }
// ServiceCreate creates service func (ac *APIController) ServiceCreate(service *contivModel.Service) error { log.Infof("Received ServiceCreate: %+v", service) // check params if (service.TenantName == "") || (service.AppName == "") { return errors.New("Invalid parameters") } // Make sure tenant exists tenant := contivModel.FindTenant(service.TenantName) if tenant == nil { return errors.New("Tenant not found") } // Find the app this service belongs to app := contivModel.FindApp(service.TenantName + ":" + service.AppName) if app == nil { return errors.New("App not found") } // Setup links modeldb.AddLink(&service.Links.App, app) modeldb.AddLinkSet(&app.LinkSets.Services, service) // Save the app too since we added the links err := app.Write() if err != nil { return err } // Check if user specified any networks if len(service.Networks) == 0 { service.Networks = append(service.Networks, "privateNet") } // link service with network for _, netName := range service.Networks { netKey := service.TenantName + ":" + netName network := contivModel.FindNetwork(netKey) if network == nil { log.Errorf("Service: %s could not find network %s", service.Key, netKey) return errors.New("Network not found") } // Link the network modeldb.AddLinkSet(&service.LinkSets.Networks, network) modeldb.AddLinkSet(&network.LinkSets.Services, service) // save the network err := network.Write() if err != nil { return err } } // Check if user specified any endpoint group for the service if len(service.EndpointGroups) == 0 { // Create one default endpointGroup per network for _, netName := range service.Networks { // params for default endpoint group dfltEpgName := service.AppName + "." + service.ServiceName + "." + netName endpointGroup := contivModel.EndpointGroup{ Key: service.TenantName + ":" + dfltEpgName, TenantName: service.TenantName, NetworkName: netName, GroupName: dfltEpgName, } // Create default endpoint group for the service err = contivModel.CreateEndpointGroup(&endpointGroup) if err != nil { log.Errorf("Error creating endpoint group: %+v, Err: %v", endpointGroup, err) return err } // Add the endpoint group to the list service.EndpointGroups = append(service.EndpointGroups, dfltEpgName) } } // Link the service and endpoint group for _, epgName := range service.EndpointGroups { endpointGroup := contivModel.FindEndpointGroup(service.TenantName + ":" + epgName) if endpointGroup == nil { log.Errorf("Error: could not find endpoint group: %s", epgName) return errors.New("could not find endpointGroup") } // setup links modeldb.AddLinkSet(&service.LinkSets.EndpointGroups, endpointGroup) modeldb.AddLinkSet(&endpointGroup.LinkSets.Services, service) // save the endpointGroup err = endpointGroup.Write() if err != nil { return err } } // Check if user specified any volume profile if service.VolumeProfile == "" { service.VolumeProfile = "default" } volProfKey := service.TenantName + ":" + service.VolumeProfile volProfile := contivModel.FindVolumeProfile(volProfKey) if volProfile == nil { log.Errorf("Could not find the volume profile: %s", service.VolumeProfile) return errors.New("VolumeProfile not found") } // fixup default values if service.Scale == 0 { service.Scale = 1 } // Create service instances for idx := int64(0); idx < service.Scale; idx++ { instID := fmt.Sprintf("%d", idx+1) var volumes []string // Create a volume for each instance based on the profile if volProfile.DatastoreType != "none" { instVolName := service.AppName + "." + service.ServiceName + "." + instID err = contivModel.CreateVolume(&contivModel.Volume{ Key: service.TenantName + ":" + instVolName, VolumeName: instVolName, TenantName: service.TenantName, DatastoreType: volProfile.DatastoreType, PoolName: volProfile.PoolName, Size: volProfile.Size, MountPoint: volProfile.MountPoint, }) if err != nil { log.Errorf("Error creating volume %s. Err: %v", instVolName, err) return err } volumes = []string{instVolName} } // build instance params instKey := service.TenantName + ":" + service.AppName + ":" + service.ServiceName + ":" + instID inst := contivModel.ServiceInstance{ Key: instKey, InstanceID: instID, TenantName: service.TenantName, AppName: service.AppName, ServiceName: service.ServiceName, Volumes: volumes, } // create the instance err := contivModel.CreateServiceInstance(&inst) if err != nil { log.Errorf("Error creating service instance: %+v. Err: %v", inst, err) return err } } return nil }