// 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 }
// 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 }
// EndpointGroupUpdate updates endpoint group func (ac *APIController) EndpointGroupUpdate(endpointGroup, params *contivModel.EndpointGroup) error { log.Infof("Received EndpointGroupUpdate: %+v, params: %+v", endpointGroup, params) // if the network association was changed, reject the update. if endpointGroup.NetworkName != params.NetworkName { return core.Errorf("Cannot change network association after epg is created.") } // 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 // For the external contracts, we can keep the update simple. Remove // all that we have now, and update the epg with the new list. // Step 1: Cleanup existing external contracts. err := cleanupExternalContracts(endpointGroup) if err != nil { return err } // Step 2: Add contracts from the update. // Consumed contracts err = setupExternalContracts(endpointGroup, params.ExtContractsGrps) if err != nil { return err } // Update the epg itself with the new contracts groups. endpointGroup.ExtContractsGrps = params.ExtContractsGrps // if there is an associated app profiles, update that as well profKey := endpointGroup.Links.AppProfile.ObjKey profObj := contivModel.FindAppProfile(profKey) if profObj == nil { log.Warnf("EndpointGroupUpdate prof %s not found", profKey) } else { log.Infof("EndpointGroupUpdate sync prof %s", profKey) DeleteAppNw(profObj) CreateAppNw(profObj) } return nil }
// EndpointGroupCreate creates end point group func (ac *APIController) EndpointGroupCreate(endpointGroup *contivModel.EndpointGroup) error { log.Infof("Received EndpointGroupCreate: %+v", endpointGroup) // Find the tenant tenant := contivModel.FindTenant(endpointGroup.TenantName) if tenant == nil { return core.Errorf("Tenant not found") } // Find the network nwObjKey := endpointGroup.TenantName + ":" + endpointGroup.NetworkName network := contivModel.FindNetwork(nwObjKey) if network == nil { return core.Errorf("Network %s not found", endpointGroup.NetworkName) } // If there is a Network with the same name as this endpointGroup, reject. nameClash := contivModel.FindNetwork(endpointGroup.Key) if nameClash != nil { return core.Errorf("Network %s conflicts with the endpointGroup name", nameClash.NetworkName) } // create the endpoint group state err := master.CreateEndpointGroup(endpointGroup.TenantName, endpointGroup.NetworkName, endpointGroup.GroupName) if err != nil { log.Errorf("Error creating endpoing group %+v. Err: %v", endpointGroup, err) 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) endpointGroupCleanup(endpointGroup) 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) endpointGroupCleanup(endpointGroup) 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 { endpointGroupCleanup(endpointGroup) return err } } // Setup external contracts this EPG might have. err = setupExternalContracts(endpointGroup, endpointGroup.ExtContractsGrps) if err != nil { log.Errorf("Error setting up external contracts for epg %s", endpointGroup.Key) endpointGroupCleanup(endpointGroup) return err } // Setup links modeldb.AddLink(&endpointGroup.Links.Network, network) modeldb.AddLink(&endpointGroup.Links.Tenant, tenant) modeldb.AddLinkSet(&network.LinkSets.EndpointGroups, endpointGroup) modeldb.AddLinkSet(&tenant.LinkSets.EndpointGroups, endpointGroup) // Save the tenant and network since we added the links err = network.Write() if err != nil { endpointGroupCleanup(endpointGroup) return err } err = tenant.Write() if err != nil { endpointGroupCleanup(endpointGroup) return err } return nil }