// ServiceInstanceCreate creates a service instance func (ac *APIController) ServiceInstanceCreate(serviceInstance *contivModel.ServiceInstance) error { log.Infof("Received ServiceInstanceCreate: %+v", serviceInstance) inst := serviceInstance // Find the service serviceKey := inst.TenantName + ":" + inst.AppName + ":" + inst.ServiceName service := contivModel.FindService(serviceKey) if service == nil { log.Errorf("Service %s not found for instance: %+v", serviceKey, inst) return errors.New("Service not found") } // Add links modeldb.AddLinkSet(&service.LinkSets.Instances, inst) modeldb.AddLink(&inst.Links.Service, service) // setup links with volumes for _, volumeName := range inst.Volumes { // find the volume volume := contivModel.FindVolume(inst.TenantName + ":" + volumeName) if volume == nil { log.Errorf("Could not find colume %s for service: %s", volumeName, inst.Key) return errors.New("Could not find the volume") } // add Links modeldb.AddLinkSet(&inst.LinkSets.Volumes, volume) modeldb.AddLinkSet(&volume.LinkSets.ServiceInstances, inst) } return nil }
// RuleCreate Creates the rule within a policy func (ac *APIController) RuleCreate(rule *contivModel.Rule) error { log.Infof("Received RuleCreate: %+v", rule) policyKey := rule.TenantName + ":" + rule.PolicyName // find the policy policy := contivModel.FindPolicy(policyKey) if policy == nil { log.Errorf("Error finding policy %s", policyKey) return core.Errorf("Policy not found") } // link the rule to policy modeldb.AddLinkSet(&rule.LinkSets.Policies, policy) modeldb.AddLinkSet(&policy.LinkSets.Rules, rule) err := policy.Write() if err != nil { return err } // Trigger policyDB Update err = master.PolicyAddRule(policy, rule) if err != nil { log.Errorf("Error adding rule %s to policy %s. Err: %v", rule.Key, policy.Key, 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 }
// 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 }
// 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 }
// ServiceInstanceCreate creates a service instance func (ac *APIController) ServiceInstanceCreate(serviceInstance *contivModel.ServiceInstance) error { log.Infof("Received ServiceInstanceCreate: %+v", serviceInstance) inst := serviceInstance // Find the service serviceKey := inst.TenantName + ":" + inst.AppName + ":" + inst.ServiceName service := contivModel.FindService(serviceKey) if service == nil { log.Errorf("Service %s not found for instance: %+v", serviceKey, inst) return core.Errorf("Service not found") } // Add links modeldb.AddLinkSet(&service.LinkSets.Instances, inst) modeldb.AddLink(&inst.Links.Service, service) 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 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 }
// EndpointGroupUpdate updates endpoint group func (ac *APIController) EndpointGroupUpdate(endpointGroup, params *contivModel.EndpointGroup) error { log.Infof("Received EndpointGroupUpdate: %+v, params: %+v", endpointGroup, params) // Only update policy attachments // Look for policy adds for _, policyName := range params.Policies { if !stringInSlice(policyName, 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 && err != master.EpgPolicyExists { log.Errorf("Error attaching policy %s to epg %s", policyName, endpointGroup.Key) return err } // Setup links modeldb.AddLinkSet(&policy.LinkSets.EndpointGroups, endpointGroup) modeldb.AddLinkSet(&endpointGroup.LinkSets.Policies, policy) err = policy.Write() if err != nil { return err } } } // now look for policy removals for _, policyName := range endpointGroup.Policies { if !stringInSlice(policyName, params.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") } // detach policy to epg err := master.PolicyDetach(endpointGroup, policy) if err != nil && err != master.EpgPolicyExists { log.Errorf("Error detaching policy %s from epg %s", policyName, endpointGroup.Key) return err } // Remove links modeldb.RemoveLinkSet(&policy.LinkSets.EndpointGroups, endpointGroup) modeldb.RemoveLinkSet(&endpointGroup.LinkSets.Policies, policy) err = policy.Write() if err != nil { return err } } } // Update the policy list endpointGroup.Policies = params.Policies 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 }