importPackage(java.util);
importPackage(java.lang);
importPackage(org.apache.log4j);
importPackage(com.cloupia.feature.ucsController);
importPackage(com.cloupia.lib.cIaaS.ucs);
importPackage(com.cloupia.lib.cIaaS.ucs.model);
importPackage(com.cloupia.lib.cIaaS.ucs.model.generated);
importPackage(com.cloupia.lib.cIaaS.ucs.util);
importPackage(com.cloupia.lib.util);
importPackage(com.cloupia.model.cIM);
importPackage(com.cloupia.service.cIM.inframgr);
importPackage(com.cloupia.service.cIM.inframgr.cmdb);
importPackage(com.cloupia.service.cIM.inframgr.customactions);
importPackage(com.cloupia.service.cIM.inframgr.profiles);
importPackage(com.cloupia.feature.ucsController.wftasks);

function executeCustomAction() {
        
	var configEntryId = ctxt.getConfigEntry().getConfigEntryId();
	var srID = ctxt.getSrId();
	var uniqueId = configEntryId + ";" + srID;
	logger.addInfo("unique id for log table = " + uniqueId);

	var config = ctxt.loadConfigObject();
	var api = null;
	var unBindVnicSPMap = new HashMap();
	var templMap = new HashMap();
	var spVnicMap = new HashMap();
	var unbindSpMap = new HashMap();
	var spTemplMap = new HashMap();
	var fabricVlanList = new ArrayList();
	var ucsVLANList = new ArrayList();
	var accountName = input.accountName;
	var orgList = "";
	var resources = "";
	var account = null;
	var vlanDnsForUndoTask = "";
	var logList = new ArrayList();
	var serviceProfileList = getServiceProfileList(input.spList);	
	var spTemplateList = getServiceProfileList(input.spTemplList);
	var vnicTemplateList = getServiceProfileList(input.vnicTemplList);
	
	logger.addInfo("Service Profile List "+serviceProfileList );
	logger.addInfo("Service Profile Template List "+spTemplateList );
	logger.addInfo("VNic template List "+vnicTemplateList );
	
	try {
		// accountName = config.getAccountName();
		account = InfrastructureDataUtil.getAccountByType(accountName, InfraAccountTypes.UCSM);
		if (account == null) {
			throw "UCS Account : " + accountName + " does not Exist!";
		}

		api = UcsDataPersistenceUtil.getNewUcsAPISession(account);

		if (api == null) {
			throw "API Session is not astablished.";
		}

		var comment = new StringBuffer();
		if (!UcsValidations.checkName32Char("VLAN name", input.name, comment)){
		   	throw comment.toString();
		}

		// construct vlan with config
		try {
			fabricVlanList = constructVlan(config, ucsVLANList);
		} catch (e) {
			logger.addError("Error construct vlan ");
			throw "Error construct vlan ";
		}

		if ((fabricVlanList != null) && (fabricVlanList.size() > 0)) {
			var sb = new StringBuffer();
			for (var i = 0; i < fabricVlanList.size(); i++) {
				var vlan = fabricVlanList.get(i);
				sb.append("");
				sb.append(XMLMarshaller.marshall(vlan));
				sb.append("");
			}

			if (sb.length() > 0)
			{
				api.queryConfigMoRequest(accountName, sb.toString());
			}

			UcsAPIActions.collectVLANInventory(account, api);

			for (var i = 0; i < fabricVlanList.size(); i++) {
				var vlan = fabricVlanList.get(i);
				var dbVLAN = UcsDataPersistenceUtil.getVLAN(accountName, vlan.getDn());

				if (dbVLAN == null) {
					throw "Unable to create VLAN : " + vlan.getName();
				} else {
					vlanDnsForUndoTask = vlanDnsForUndoTask + vlan.getDn() + ";";
					logger.addInfo("VLAN created");
					// updating vlan pool table
					//updateVlanPoolTable(vlan, account);
				}
			}

			vlanDnsForUndoTask = vlanDnsForUndoTask.substring(0, vlanDnsForUndoTask.lastIndexOf(";"));
			logger.addInfo("vlans for undo task : " + vlanDnsForUndoTask);

			var vlanIdentity = new UcsVLANIdentity(accountName, fabricVlanList.get(0).getDn());

			ctxt.getChangeTracker().undoableResourceAdded(UcsAssetTypeConstants.UCS_VLAN,
					vlanIdentity.getIdentityKey(), input.name, "VLAN Created ",
					UcsVLANDeleteConfig.HANDLER_NAME,
					new UcsVLANDeleteConfig(input.accountName, uniqueId, vlanDnsForUndoTask)); 
			ctxt.saveOutputValue("OUTPUT_VLAN_IDENTITY1", accountName + ";" + fabricVlanList.get(0).getDn());
			var dbVLAN = UcsDataPersistenceUtil.getVLAN(accountName,fabricVlanList.get(0).getDn());
			 if(dbVLAN != null)
			   ctxt.saveOutputValue("OUTPUT_VLAN_ID1", dbVLAN.getId());
			 else
				 ctxt.saveOutputValue("OUTPUT_VLAN_ID1", "");
			

			addChangeRecord(ctxt.getUserId(), fabricVlanList.get(0), ChangeRecord.CHANGE_TYPE_ADD, accountName);

			if (fabricVlanList.size() == 2) {
				vlanIdentity = new UcsVLANIdentity(accountName, fabricVlanList.get(1).getDn());				
				ctxt.getChangeTracker().resourceAdded(UcsAssetTypeConstants.UCS_VLAN,
						vlanIdentity.getIdentityKey(), input.name, "VLAN Created ");                    

				addChangeRecord(ctxt.getUserId(), fabricVlanList.get(1), ChangeRecord.CHANGE_TYPE_ADD,
						accountName);
				ctxt.saveOutputValue("OUTPUT_VLAN_IDENTITY2", accountName + ";" + fabricVlanList.get(1).getDn());
				dbVLAN = UcsDataPersistenceUtil.getVLAN(accountName,fabricVlanList.get(1).getDn());
				if(dbVLAN != null)
				  ctxt.saveOutputValue("OUTPUT_VLAN_ID2", dbVLAN.getId());
				
			} else if(fabricVlanList.size() == 1) {
				ctxt.saveOutputValue("OUTPUT_VLAN_IDENTITY2", "");
				ctxt.saveOutputValue("OUTPUT_VLAN_ID2", "");
			}
		}

		/*if (!config.isVirtualInfra()) {			
			var log = new UCSAddVLANToSPLog();
			log.setType(UCSAddVLANToSPLog.VIRTUAL_INFRA_FALSE);
			log.setTarget("");
			log.setAccountName(accountName);
			log.setUniqueId(uniqueId);

			if (ucsVLANList.size() == 1) {
				log.setDn(ucsVLANList.get(0).getDn());
			} else if (ucsVLANList.size() == 2) {
				log.setDn(ucsVLANList.get(0).getDn() + ";" + ucsVLANList.get(1).getDn());
			}
			logList.add(log);
			UcsDataPersistenceUtil.persistAddVLANtoSPLog(logList);			
			return;
		}*/
	} 
	catch (ex) {
		logger.addError("VLAN creation failed."+ex.message);
		throw " VLAN creation failed. ";
	} finally {
		UcsDataPersistenceUtil.closeUcsAPISession(api);
	}

	try {
		logger.addInfo("ucsVlan size "+ucsVLANList.size());
		for (var j = 0; j < ucsVLANList.size(); j++) {
			var ucsVlan = ucsVLANList.get(j);	
			unBindVnicSPMap = new HashMap();
			templMap = new HashMap();
			spVnicMap = new HashMap();
			unbindSpMap = new HashMap();
			spTemplMap = new HashMap();
			logList = new ArrayList();

			var entryList = new ArrayList();
			var chList = new ArrayList();
			orgList = getOrgList(input.orgList);
			
			resources = null;
			if ((orgList == null) || (orgList.length() == 0)) {
			   
				throw "Failed to get resources to add VLAN.";
			}

			api = UcsDataPersistenceUtil.getNewUcsAPISession(account);
			if (api == null) {
				throw "API Session is not astablished.";
			}

			
			logger.addInfo("List of organizations to add VLAN : " + orgList);
			if (UcsDataPersistenceUtil.isFeatureSupported(accountName, UcsConstants.FEATURE_CONST_VLAN_GROUPING)) {
				logger.addInfo("Updating Org Permissions....");
				modifyVLANOrgList(orgList, input.name, accountName,ctxt);
				logger.addInfo("Org Permissions updated successfully.");
			}

			var resArr = null;
			if (resources != null) 	{
				resArr = resources.split(",");
			}
			var resMap = new HashMap();

		   // if ((resArr == null) || (resArr.length == 0))
			if((vnicTemplateList != null && !(new java.lang.String(input.getVnicTemplList)).isEmpty()) 
					||(serviceProfileList != null && !(new java.lang.String(serviceProfileList)).isEmpty()) 
					|| (spTemplateList != null && !(new java.lang.String(spTemplateList)).isEmpty()))
			{
				
				var vnicTemplListForAcc = new ArrayList();
				var spListForAcc = new ArrayList();
				var vNICOrgList = new ArrayList();
				var spOrgList = new ArrayList();
				vnicTemplListForAcc = UcsDataPersistenceUtil.getVNICTemplatesForAcc(accountName);
				spListForAcc = UcsDataPersistenceUtil.getServiceProfileForAcc(accountName);
				
				if(vnicTemplListForAcc != null)
				{
					for (var k = 0; k < vnicTemplListForAcc.size(); k++) {
						var t = vnicTemplListForAcc.get(k);						
						if (vnicTemplateList != null)
						{
							var arr = vnicTemplateList.split(",");
							if (arr != null && arr.length > 0)
							{
								for (var m = 0; m < arr.length; m++) {
									var s = arr[m];
									if (s.equals(t.getDn()))
									{
										vNICOrgList.add(t);
									}
								}
							}
						}
					}
				}
				
				if(spListForAcc != null)
				{
					for (var k = 0; k < spListForAcc.size(); k++) {
						var t = spListForAcc.get(k);
						if (serviceProfileList != null)
						{
							var arr = serviceProfileList.split(",");
							if (arr != null && arr.length > 0)
							{
								for (var m = 0; m < arr.length; m++) {
									var s = arr[m];
									if (s.equals(t.getDn()))
									{
										spOrgList.add(t);
									}
								}
							}
						}
					}
					
					for (var k = 0; k < spListForAcc.size(); k++) {
						var t = spListForAcc.get(k);
						if (spTemplateList != null)
						{
							var arr = spTemplateList.split(",");
							if (arr != null && arr.length > 0)
							{
								for (var m = 0; m < arr.length; m++) {
									var s = arr[m];
									if (s.equals(t.getDn()))
									{
										spOrgList.add(t);
									}
								}
							}
						}
					}
				}
				
				collectObjectsToAddVLAN(accountName, orgList, ucsVlan.getSwitchId(), spVnicMap, unBindVnicSPMap,
						templMap, unbindSpMap, vNICOrgList, spOrgList);
			}
			else
			{
				if (resArr != null && resArr.length > 0)
				{
					if (resArr.length == 3)
					{
						var vnicTemplListForAcc = new ArrayList();
						var spListForAcc = new ArrayList();

						vnicTemplListForAcc = UcsDataPersistenceUtil.getVNICTemplatesForAcc(accountName);
						spListForAcc = UcsDataPersistenceUtil.getServiceProfileForAcc(accountName);

						collectObjectsToAddVLAN(accountName, orgList, ucsVlan.getSwitchId(), spVnicMap,
								unBindVnicSPMap, templMap, unbindSpMap, vnicTemplListForAcc, spListForAcc);
					} else
					{
						// "Service Profile", "Service Profile Templates", "vNIC Templates"
						for (var i = 0; i < resArr.length; i++)
							resMap.put(resArr[i], resArr[i]);

						if (resMap.containsKey("vNIC Templates"))
						{
							collectVNICTemplatesToAddVLAN(accountName, orgList, ucsVlan.getSwitchId(), templMap);
						}

						if (resMap.containsKey("Service Profile Templates"))
						{
							collectSPTemplsToAddVLAN(accountName, orgList, ucsVlan.getSwitchId(), spVnicMap,
									unBindVnicSPMap, templMap, spTemplMap);
						}

						if (resMap.containsKey("Service Profiles"))
						{
							collectSPsToAddVLAN(accountName, orgList, ucsVlan.getSwitchId(), spVnicMap,
									unBindVnicSPMap, unbindSpMap, templMap, spTemplMap);
						}
					}
				}
			}
			logger.addInfo("spVnicMap map size : " + spVnicMap.size());
			logger.addInfo("unBindVnicSPMap map size : " + unBindVnicSPMap.size());
			logger.addInfo("templMap map size : " + templMap.size());

			if ((spVnicMap.size() == 0) && (unBindVnicSPMap.size() == 0) && (templMap.size() == 0))
			{
				logger.addInfo("No service profiles, service profile templates and VNIC templates are found to modify vlan for Fabric " + ucsVlan.getSwitchId() + ".");

				continue;
			}

			var unbindSPList = new ArrayList();
			unbindSPList = createRequestToUnbindSPFromTemplate(unbindSpMap, uniqueId, logList, ctxt, entryList,
					chList);

			var unbindVnicSPList = new ArrayList();
			unbindVnicSPList = createRequestToUnbindVNICTemplFromSP(unBindVnicSPMap, uniqueId, logList, ctxt,
					entryList, chList);

			var spVnicList = new ArrayList();
			spVnicList = createRequestToAddVLANToSP(spVnicMap, ucsVlan, templMap, uniqueId, logList, ctxt,
					entryList, chList);

			var vnicTemplList = new ArrayList();
			vnicTemplList = createRequestToAddVLANToVNICTempl(templMap, ucsVlan, uniqueId, logList, ctxt,
					entryList, chList);

			var sb = new StringBuffer();

			if (unbindSpMap.size() > 0)
			{
				for (var m = 0; m < unbindSPList.size(); m++) {
					var ls = unbindSPList.get(m);					
					sb.append("");
					sb.append(XMLMarshaller.marshall(ls));
					sb.append("");
				}
			}
			for (var m = 0; m < unbindVnicSPList.size(); m++) {
				var spVnic = unbindVnicSPList.get(m);                
				sb.append("");
				sb.append(XMLMarshaller.marshall(spVnic));
				sb.append("");
			}

			api.queryConfigMoRequest(accountName, sb.toString());

			sb = new StringBuffer();

			for (var m = 0; m < spVnicList.size(); m++) {
				var spVnic = spVnicList.get(m);			
				sb.append("");
				sb.append(XMLMarshaller.marshall(spVnic));
				sb.append("");
			}

			for (var m = 0; m < vnicTemplList.size(); m++) {
				var vnicTempl = vnicTemplList.get(m);				
				sb.append("");
				sb.append(XMLMarshaller.marshall(vnicTempl));
				sb.append("");
			}

			api.queryConfigMoRequest(accountName, sb.toString());

			logger.addInfo("VLAN added to : " + orgList);

			sb = new StringBuffer();
			
			for (var m = 0; m < spVnicList.size(); m++) {
				var vnic = spVnicList.get(m);
				sb.append(vnic.getDn() + ";");					
			}
			
			for (var m = 0; m < vnicTemplList.size(); m++) {
				var vnic = vnicTemplList.get(m);
				sb.append(vnic.getDn() + ";");
			}
			
			var modifiedDns = sb.toString();
			modifiedDns = modifiedDns.substring(0, modifiedDns.lastIndexOf(';'));
			logger.addInfo("Affected objects with new VLANs configured for fabric " + ucsVlan.getSwitchId()
					+ "   " + modifiedDns);
			UcsDataPersistenceUtil.collectVNICTemplateInventory(account, api);
			UcsDataPersistenceUtil.collectServiceProfileInventory(accountName);
			// UcsAPIActions.collectAssocVLANInventory(account, api);
			UcsDataPersistenceUtil.persistAddVLANtoSPLog(logList);

				// resource tracking
			ctxt.getChangeTracker().addEntry(entryList);
			
			UcsCMDBUtil.persistChangeRecord(chList);
		}
		
	} catch (ex2) {
		logger.addError("VLAN creation failed."+ex2.message);
		throw VLANCreationConfig.HANDLER_NAME + " failed. ";
	} finally {
		UcsDataPersistenceUtil.closeUcsAPISession(api);
	}
}
function constructVlan(config, ucsVLANList) {
	var fabricVlanList = new ArrayList();
	var vlanName = input.name;
	var vlanId = -1;
	if (input.vlanType.equals("dual")) {
		
		if (input.dualVLAN == null) {
			throw "Dual VLAN is unavailable.";
		}

		var vlan = new UcsVLAN();
		vlan.setName(vlanName);
		vlan.setSwitchId("dual");
		vlan.setId(input.dualVLAN);
		setVLANSharing(vlan, input.sharing_all, input.pubNwName_all);
		vlanId = Integer.parseInt(input.dualVLAN);

		if ((vlanId != 0) && ((vlanId < 1) || (vlanId > 4093) || ((vlanId > 3967) && (vlanId < 4048))))
		{
			throw "VLAN ID should be a numeric value between [1-3967] and [4048-4093]";
		}

		vlan.setDn("fabric/lan/net-" + vlanName);
		
		ucsVLANList.add(vlan);
	}

	for (var i = 0; i < ucsVLANList.size(); i++) {
		var ucsVlan = ucsVLANList.get(i);
		
		var fabVlan = new FabricVlan();
		fabVlan.setName(ucsVlan.getName());
		fabVlan.setId(ucsVlan.getId());
		// fabVlan.setSwitchId(ucsVlan.getSwitchId());
		fabVlan.setDn(ucsVlan.getDn());
		fabVlan.setDefaultNet("no");
		fabVlan.setSharing(ucsVlan.getSharing());
		fabVlan.setPubNwName(ucsVlan.getPubNwName());
		fabVlan.setStatus(UcsAPIConstants.MANAGED_OBJECT_STATUS_CREATED);
		fabricVlanList.add(fabVlan);
	}

	return fabricVlanList;
}

function createRequestToUnbindVNICTemplFromSP(unBindVnicSPMap,uniqueId,logList, context, entryList,chList) {

	var vnicList = new ArrayList();
	var i = unBindVnicSPMap.keySet().iterator();

	while (i.hasNext()) {
		var vnicDn = i.next();
		var spVnic = unBindVnicSPMap.get(vnicDn);
		var vnic = new VnicEther();
		vnic.setDn(spVnic.getDn());
		vnic.setNwTemplName(""); // unbound vnic templ from sp vnic
		vnicList.add(vnic);
		var log = new UCSAddVLANToSPLog();
		log.setType(UCSAddVLANToSPLog.BIND_SP_VNIC);
		log.setTarget(spVnic.getNwTemplName());
		log.setDn(spVnic.getDn());
		log.setAccountName(spVnic.getAccountName());
		// log.setConfigEntryId(configEntryID);
		log.setUniqueId(uniqueId);
		logList.add(log);

		try {
			logger.addInfo("in createRequestToUnbindVNICTemplFromSP : " + logList);
			var sp = UcsDataPersistenceUtil.getServiceProfileForAccountAndDn(spVnic.getSpDn(),spVnic.getAccountName());

			if (sp != null) {
				if (!ctxt.isRESTContext()) {
					entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE, sp.getIdentityKey(), sp
							.getDn(), "Service Profile's vNIC '" + spVnic.getName()
							+ "' is unbound from vNIC Template : " + spVnic.getNwTemplName(), ctxt));
				}
				chList.add(createCMDBRecord1("Service Profile's vNIC '" + spVnic.getName()
						+ "' is unbound from vNIC Template : " + spVnic.getNwTemplName(), ctxt.getUserId(), sp));
			}
		} catch (e) {
			logger.addError(e.message);
		}
	}

	return vnicList;
}

    function createRequestToAddVLANToSP(spVnicMap, ucsVlan, templMap, uniqueId, logList, context, entryList, chList) {
	
	
        var vnicList = new ArrayList();
        var i = spVnicMap.keySet().iterator();

        while (i.hasNext())
        {
            var spVnicDn =   i.next();
            var spVnic = spVnicMap.get(spVnicDn);

            if ((spVnic.getSwitchId() != null)
                    && (spVnic.getSwitchId().startsWith(ucsVlan.getSwitchId()) || ucsVlan.getSwitchId().equals("dual")))
            {
                var vnic = new VnicEther();
                vnic.setDn(spVnicDn);

                var vlan = new VnicEtherIf();
                vlan.setName(ucsVlan.getName());
                vlan.setRn("if-" + ucsVlan.getName());
                vlan.setStatus("created");

                var vlanArr = new Array();
                vlanArr[0] = vlan;
                vnic.setVnicEtherIf(vlanArr);
                vnicList.add(vnic);

                var log = new UCSAddVLANToSPLog();
                log.setType(UCSAddVLANToSPLog.DELETE_VLAN);
                log.setDn(spVnicDn);
                log.setAccountName(spVnic.getAccountName());
                log.setUniqueId(uniqueId);
                log.setVlanName(ucsVlan.getName());
                log.setTarget("");
                logList.add(log);

                // resource tracking
                var sp = UcsDataPersistenceUtil.getServiceProfileForAccountAndDn(spVnic.getSpDn(), spVnic.getAccountName());

                if (sp != null)
                {
                    if (sp.getType().equals(GlobalConstants.FIELD_CONSTANTS.SERVICE_PROFILE_TYPE_INTANCE))
                    {
                        
						if (!ctxt.isRESTContext())
                        {
                            entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE, sp.getIdentityKey(),
                                    sp.getDn(), "VLAN( " + ucsVlan.getName() + ") is added to Service Profile's vNIC '"
                                            + spVnic.getName() + "'", ctxt));
                        }
                        chList.add(createCMDBRecord1("VLAN( " + ucsVlan.getName()
                                + ") is added to Service Profile's vNIC '" + spVnic.getName() + "'",
                                ctxt.getUserId(), sp ));
                    } else
                    {
                    	
						if (!ctxt.isRESTContext())
                        {
                            entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE_TEMPLATE, sp.getIdentityKey(), sp.getDn(), "VLAN( " + ucsVlan.getName()
                                    + ") is added to Service Profile Templates's vNIC '" + spVnic.getName() + "'",
                                    ctxt));
                        }
                        chList.add(createCMDBRecord1("VLAN( " + ucsVlan.getName()
                                + ") is added to Service Profile Templates's vNIC '" + spVnic.getName() + "'",
                                ctxt.getUserId(), sp));

                        try
                        {
                            if (sp.getType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                            {
                                var assocSPList = UcsDataPersistenceUtil.getServiceProfilesAssociatedToTemplate(sp.getAccountName(), sp.getDn());

                                if ((assocSPList != null) && (assocSPList.size() > 0))
                                {
                                    for (var j = 0; j < assocSPList.size(); j++) {
                                		var assocSP = assocSPList.get(j);
                                        entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE,
                                                assocSP.getIdentityKey(), assocSP.getDn(), "VLAN( " + ucsVlan.getName()
                                                        + ") is added to Service Profile's vNIC '" + spVnic.getName()
                                                        + "'", ctxt));
                                        chList.add(createCMDBRecord1("VLAN( " + ucsVlan.getName()
                                                + ") is added to Service Profile's vNIC '" + spVnic.getName() + "'",
                                                ctxt.getUserId(), sp));
                                    }
                                }
                            }
                        } catch (e) {
                            logger.addError("Error while recording resources for Service Profiles associated with Templates."+e.message);
                        }
                    }
                } // end of resource tracking
            }
        }

        return vnicList;
    }

    function createRequestToAddVLANToVNICTempl(spMap,ucsVlan, uniqueId, logList, context,entryList,chList) {
        var vnicTemplList = new ArrayList();

        if (spMap.size() == 0) {
            return vnicTemplList;
        }
		
		var arr = spMap.values().toArray();
        for (var i = 0; i < arr.length; i++) {
        	var vnicTempl = arr[i];
			
            if ((vnicTempl.getSwitchId() != null)
                    && (vnicTempl.getSwitchId().startsWith(ucsVlan.getSwitchId()) || ucsVlan.getSwitchId().equals(
                            "dual")))
            {
                var vnic = new VnicLanConnTempl();
                vnic.setDn(vnicTempl.getDn());

                var vlan = new VnicEtherIf();
                vlan.setName(ucsVlan.getName());
                vlan.setRn("if-" + ucsVlan.getName());
                vlan.setStatus("created");

                var vlanArr = new Array();
                vlanArr[0] = vlan;
                vnic.setVnicEtherIf(vlanArr);
                vnicTemplList.add(vnic);

                var log = new UCSAddVLANToSPLog();
                log.setType(UCSAddVLANToSPLog.DELETE_VLAN_FROM_VNIC_TEMPL);
                log.setDn(vnicTempl.getDn());
                log.setAccountName(vnicTempl.getAccountName());
                log.setUniqueId(uniqueId);
                log.setVlanName(ucsVlan.getName());
                log.setTarget("");
                logList.add(log);

                if (!ctxt.isRESTContext())
                {
                    entryList.add(resourceChange(UcsAssetTypeConstants.UCS_VNIC_TEMPLATE, vnicTempl.getIdentityKey(),
                            vnicTempl.getDn(), "VLAN( " + ucsVlan.getName() + ") is added to vNIC Template", ctxt));
                }
                chList.add(createCMDBRecord("VLAN( " + ucsVlan.getName() + ") is added to vNIC Template",
                        ctxt.getUserId(), vnicTempl));

                try
                {
					logger.addInfo("vnicTempl.getTemplType()");
                    if (vnicTempl.getTemplType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                    {
                        var nList = UcsDataPersistenceUtil
                                .getServiceProfilesAssociatedToVNICTemplate(ucsVlan.getAccountName(), vnicTempl.getDn());

                        if ((nList != null) && (nList.size() > 0))
                        {
                            for (var i = 0; i < nList.size(); i++) {
                            	var n = nList.get(i);
                                var id = new UcsServiceProfileIdentity(ucsVlan.getAccountName()
                                        + ";" + n.getOrg() + ";" + n.getSpDn());
                                if (!ctxt.isRESTContext())
                                {
                                    entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE, id
                                            .getIdentityKey(), n.getSpDn(), "VLAN( " + ucsVlan.getName()
                                            + ") is added to Service Profile's vNIC '" + n.getName() + "'", ctxt));
                                }
                                var sp = UcsDataPersistenceUtil.getServiceProfileByIdentity(id
                                        .getIdentityKey());

                                if (sp != null)
                                {
                                    chList.add(createCMDBRecord1("VLAN( " + ucsVlan.getName()
                                            + ") is added to Service Profile's vNIC '" + n.getName() + "'",
                                            ctxt.getUserId(), sp));
                                }
                            }
                        }
                    }
                } catch (e)
                {
                    logger.addError(
                            "Error while recording resources for Service Profile VNICs associated with vNIC Templates."+e.message);
                }
            }
        }

        return vnicTemplList;
    }

    function collectSPsToAddVLAN(accountName, orgList, switchId,spVnicMap, unBindVnicSPMap,
            unbindSpMap,  vnicTemplMap, spTemplMap) {
        var vnicTemplListForAcc = new ArrayList();
        var spListForAcc = new ArrayList();
        var spMap = new HashMap();
        var unwantedSpMap = new HashMap();
        var unwantedSpVnicMap = new HashMap();

        if ((switchId == null) || (switchId.length() == 0))
        {
            throw "Failed to get Switch ID.";
        }

        // account level vnic templates and SPs list
        vnicTemplListForAcc = UcsDataPersistenceUtil.getVNICTemplatesForAcc(accountName);
        spListForAcc = UcsDataPersistenceUtil.getServiceProfileForAcc(accountName);

        if ((spListForAcc == null) || (vnicTemplListForAcc == null))
        {
            throw "Failed to retrieve VNIC Templates and Service Profiles.";
        }

        if ((spListForAcc.size() == 0) && (vnicTemplListForAcc.size() == 0))
        {
            return;
        }

        logger.addInfo("vnicTemplListForAcc list size : " + vnicTemplListForAcc.size());
        logger.addInfo("spListForAcc list size : " + spListForAcc.size());

        var orgArr = orgList.split(",");
        logger.addInfo("org list size : " + orgArr.length);

        for (var i = 0; i < orgArr.length; i++) {
        	var orgDn = orgArr[i];
            logger.addInfo("orgDn : " + orgDn);

            // collect all org level SPs
			for (var i = 0; i < spListForAcc.size(); i++) {
            	var sp = spListForAcc.get(i);
                if ((sp.getOrgName() != null) && sp.getOrgName().equals(orgDn)) {
                    if (sp.getType().equals("instance"))
                    {
                        spMap.put(sp.getDn(), sp);
                    }
                }
            }
        } // end of orgArr

        // ..................logger...............................
        logger.addInfo("Size of SP Map for orglist  : " + spMap.size());

        var j = 1;
        var i = spMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " + i.next());
		
		var arr = spMap.values().toArray();
        for (var i = 0; i < arr.length; i++) {
        	var sp = arr[i];
		    if (sp.getDn() != null) {
                if ((sp.getSrcTemplName() != null) && (sp.getSrcTemplName().length() > 0))
                {
                    var assocSPTempl = getAssocSPTempl(accountName, sp);

                    if (assocSPTempl.getType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                    {
                        if (assocSPTempl.getType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                        {
                            if (spTemplMap.containsKey(assocSPTempl.getDn()))
                            {
                                unwantedSpMap.put(sp.getDn(), sp);
                            } else
                            {
                                unbindSpMap.put(sp.getDn(), sp);
                            }
                        }
                    }
                }
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of unwantedSpMap  : " + unwantedSpMap.size());
        j = 1;
        i = unwantedSpMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +  i.next());

        logger.addInfo("Size of unbindSpMap  : " + unbindSpMap.size());
        j = 1;
        i = unbindSpMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // ..................logger...............................

        // remove SPs which are bound to updating SP Templ and the template is part of org selection
        i = unwantedSpMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();

            if (spMap.containsKey(key))
            {
                spMap.remove(key);
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of SP map after removing unwanted SPs : " + spMap.size());
        j = 1;
        i = spMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " + i.next());

        // ..................logger...............................

        // collect sp vnics
		
		var arr = spMap.values().toArray();
        for (var m = 0; m < arr.length; m++) {
        	var sp = arr[m];
		    // initCount = uptCount = normalVnicCount = 0;
            if (sp.getSpVNIC() == null)
            {
                continue;
            }
			for (var k = 0; k <  sp.getSpVNIC().size(); k++) {
            	var spVnic = sp.getSpVNIC().get(k);
                if ((spVnic.getSwitchId() != null) && (spVnic.getSwitchId().startsWith(switchId) || switchId.equals("dual"))) {
                    // cannot add vlan to dynamic vnics
                    if ((spVnic.getInstType() != null) && !spVnic.getInstType().equals("dynamic"))
                    {
                        spVnicMap.put(spVnic.getDn(), spVnic); // add sp vnic to map
                        logger.addInfo("SP VNIC : " + spVnic.getDn());

                        if ((spVnic.getNwTemplName() != null) && (spVnic.getSrcTemplDn() != null)
                                && (spVnic.getNwTemplName().length() > 0) && (spVnic.getSrcTemplDn().length() > 0))
                        {
                            var assocVNICTempl = getVnicFromList(vnicTemplListForAcc,
                                    spVnic.getSrcTemplDn());

                            if (assocVNICTempl != null)
                            {
							logger.addInfo("assocVNICTempl.getTemplType()");
                                if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_INITIAL_TEMPLATE))
                                {
                                    // unbind this vnic from template before adding vlan
                                    unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());
                                    logger.addInfo("Unbind Template");
                                } else if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                                {
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());

                                    if (vnicTemplMap.containsKey(assocVNICTempl.getDn()))
                                    {
                                        logger.addInfo("Remove SP vnic from MAP");
                                        unwantedSpVnicMap.put(spVnic.getDn(), spVnic);
                                    } else
                                    {
                                        logger.addInfo("Unbind Template");
                                        unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } // end of //collect all the sps which have associated vnic templates

        // ..................logger...............................
        logger.addInfo("Size of unwantedSpVnicMap : " + unwantedSpVnicMap.size());
        j = 1;
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +  i.next());

        logger.addInfo("Size of SP VNIC MAP : " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +  i.next());

        logger.addInfo("Size of SPs that need to be unbound : " + unBindVnicSPMap.size());
        j = 1;
        i = unBindVnicSPMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();
            logger.addInfo(j++ + "Src Templ Dn : " + key + "  vnic templ Dn : " + unBindVnicSPMap.get(key).getDn());
            ;
        }

        // remove these sp vnics from the total sp vnic list as it is enough to modify the updating
        // vnic templ
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();

            if (spVnicMap.containsKey(key))
            {
                spVnicMap.remove(key);
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of SP VNIC MAP after removing unwanted sp vnics: " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("End of collectObjectsToAddVLAN()");

        // ..................logger...............................
    }

    function collectVNICTemplatesToAddVLAN(accountName, orgList, switchId, templMap) {
        var vnicTemplListForAcc = new ArrayList();
        var initTemplMap = new HashMap();
        var updTemplMap = new HashMap();

        if ((switchId == null) || (switchId.length() == 0))
        {
            throw "Failed to get Switch ID.";
        }

        // account level vnic templates and SPs list
        vnicTemplListForAcc = UcsDataPersistenceUtil.getVNICTemplatesForAcc(accountName);

        if (vnicTemplListForAcc == null)
        {
            throw "Failed to retrieve VNIC Templates and Service Profiles.";
        }

        if (vnicTemplListForAcc.size() == 0)
        {
            return;
        }

        logger.addInfo("vnicTemplListForAcc list size : " + vnicTemplListForAcc.size());

        var orgArr = orgList.split(",");
        logger.addInfo("org list size : " + orgArr.length);

        for (var i = 0; i < orgArr.length; i++) {
        	var orgDn = orgArr[i];
		    // collect all vnic templates for org
			for (var n = 0; n < vnicTemplListForAcc.size(); n++) {
            	var templ = vnicTemplListForAcc.get(n);
            
                if (templ.getDn() != null)
                {
                    if ((templ.getSwitchId() != null)
                            && (templ.getSwitchId().startsWith(switchId) || switchId.equals("dual")))
                    {
                        if ((templ.getOrg() != null) && templ.getOrg().equals(orgDn))
                        {
                            logger.addInfo("templ.getTemplType()");
							if ((templ.getTemplType() != null)
                                    && templ.getTemplType().equals(UcsConstants.SERVICE_PROFILE_TYPE_INITIAL_TEMPLATE))
                            {
                                initTemplMap.put(templ.getDn(), templ);
                            } else if (templ.getTemplType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                            {
                                updTemplMap.put(templ.getDn(), templ);
                            }
                        }
                    }
                }
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of Initial template map for orglist  : " + initTemplMap.size());

        var j = 1;
        var i = initTemplMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +  i.next());

        logger.addInfo("Size of Updating template map for orglist : " + updTemplMap.size());
        j = 1;
        i = updTemplMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // combine into single template map
        templMap.putAll(initTemplMap);
        templMap.putAll(updTemplMap);

        // ..................logger...............................
        logger.addInfo("Final vnic templ size : " + templMap.size());
        j = 1;
        i = templMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +  i.next());

        logger.addInfo("End of collectObjectsToAddVLAN()");

        // ..................logger...............................
    }

    function collectSPTemplsToAddVLAN(accountName, orgList, switchId,
            spVnicMap, unBindVnicSPMap,vnicTemplMap, spTemplMap) {
        var vnicTemplListForAcc = new ArrayList();
        var spListForAcc = new ArrayList();
        var unwantedSpVnicMap = new HashMap();

        if ((switchId == null) || (switchId.length() == 0))
        {
            throw "Failed to get Switch ID.";
        }

        // account level vnic templates and SPs list
        vnicTemplListForAcc = UcsDataPersistenceUtil.getVNICTemplatesForAcc(accountName);
        spListForAcc = UcsDataPersistenceUtil.getServiceProfileForAcc(accountName);

        if ((spListForAcc == null) || (vnicTemplListForAcc == null))
        {
            throw "Failed to retrieve VNIC Templates and Service Profiles.";
        }

        if ((spListForAcc.size() == 0) && (vnicTemplListForAcc.size() == 0))
        {
            return;
        }

        logger.addInfo("vnicTemplListForAcc list size : " + vnicTemplListForAcc.size());
        logger.addInfo("spListForAcc list size : " + spListForAcc.size());

        var orgArr = orgList.split(",");
        logger.addInfo("org list size : " + orgArr.length);

        for (var k = 0; k < orgArr.length; k++) {
        	var orgDn = orgArr[k];
            logger.addInfo("orgDn : " + orgDn);

            // collect all org level SP Templates
			for (var i = 0; i < spListForAcc.size(); i++) {
            	var sp = spListForAcc.get(i);            
                if ((sp.getOrgName() != null) && sp.getOrgName().equals(orgDn))
                {
                    if (!sp.getType().equals("instance"))
                    {
                        spTemplMap.put(sp.getDn(), sp);
                    }
                }
            }
        } // end of orgArr

        // ..................logger...............................
        logger.addInfo("Size of SP Map for orglist  : " + spTemplMap.size());

        var j = 1;
        var i = spTemplMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // ..................logger...............................

        // collect sp vnics
		var arr = spTemplMap.values().toArray();
        for (var i = 0; i < arr.length; i++) {
        	var sp = arr[i];        
            // initCount = uptCount = normalVnicCount = 0;
            if (sp.getSpVNIC() == null)
            {
                continue;
            }

             for (var k = 0; k <  sp.getSpVNIC().size(); k++) {
            	var spVnic = sp.getSpVNIC().get(k);
                if ((spVnic.getSwitchId() != null)
                        && (spVnic.getSwitchId().startsWith(switchId) || switchId.equals("dual")))
                {
                    // cannot add vlan to dynamic vnics
                    if ((spVnic.getInstType() != null) && !spVnic.getInstType().equals("dynamic"))
                    {
                        spVnicMap.put(spVnic.getDn(), spVnic); // add sp vnic to map
                        logger.addInfo("SP VNIC : " + spVnic.getDn());

                        if ((spVnic.getNwTemplName() != null) && (spVnic.getSrcTemplDn() != null)
                                && (spVnic.getNwTemplName().length() > 0) && (spVnic.getSrcTemplDn().length() > 0))
                        {
                            var assocVNICTempl = getVnicFromList(vnicTemplListForAcc,
                                    spVnic.getSrcTemplDn());

                            if (assocVNICTempl != null)
                            {
                                logger.addInfo("assocVNICTempl.getTemplType()");
								if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_INITIAL_TEMPLATE))
                                {
                                    // unbind this vnic from template before adding vlan
                                    unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());
                                    logger.addInfo("Unbind Template");
                                } else if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                                {
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());

                                    if (vnicTemplMap.containsKey(assocVNICTempl.getDn()))
                                    {
                                        logger.addInfo("Remove SP vnic from MAP");
                                        unwantedSpVnicMap.put(spVnic.getDn(), spVnic);
                                    } else
                                    {
                                        logger.addInfo("Unbind Template");
                                        unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } // end of //collect all the sps which have associated vnic templates

        // ..................logger...............................
        logger.addInfo("Size of unwantedSpVnicMap : " + unwantedSpVnicMap.size());
        j = 1;
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of SP VNIC MAP : " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of SPs that need to be unbound : " + unBindVnicSPMap.size());
        j = 1;
        i = unBindVnicSPMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();
            logger.addInfo(j++ + "Src Templ Dn : " + key + "  vnic templ Dn : " + unBindVnicSPMap.get(key).getDn());
            ;
        }

        // remove these sp vnics from the total sp vnic list as it is enough to modify the updating
        // vnic templ
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();

            if (spVnicMap.containsKey(key))
            {
                spVnicMap.remove(key);
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of SP VNIC MAP after removing unwanted sp vnics: " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("End of collectObjectsToAddVLAN()");

        // ..................logger...............................
    }

    function getVnicFromList(vnicTemplListForAcc, srcTemplDn)
    {
        for (var i = 0; i < vnicTemplListForAcc.size(); i++) {
        	var t = vnicTemplListForAcc.get(i);
            if (t.getDn().equals(srcTemplDn))
            {
                return t;
            }
        }

        return null;
    }

    function collectObjectsToAddVLAN(accountName, orgList, switchId,
            spVnicMap, unBindVnicSPMap, templMap, unbindSpMap, vnicTemplListForAcc, spListForAcc) {
       
		var initTemplMap = new HashMap();
        var updTemplMap = new HashMap();
        var spMap = new HashMap();
        var unwantedSpMap = new HashMap();
        var unwantedSpVnicMap = new HashMap();
		logger.addInfo("Switch Id "+switchId);
        if ((switchId == null) || (switchId.length() == 0))
        {
            throw "Failed to get Switch ID.";
        }

        logger.addInfo("spListForAcc "+spListForAcc);
		logger.addInfo("vnicTemplListForAcc "+vnicTemplListForAcc);
		
        if ((spListForAcc == null) || (vnicTemplListForAcc == null))
        {
            throw "Failed to retrieve VNIC Templates and Service Profiles.";
        }

        if ((spListForAcc.size() == 0) && (vnicTemplListForAcc.size() == 0))
        {
            return;
        }

        logger.addInfo("vnicTemplListForAcc list size : " + vnicTemplListForAcc.size());
        logger.addInfo("spListForAcc list size : " + spListForAcc.size());

        var orgArr = orgList.split(",");
        logger.addInfo("org list size : " + orgArr.length);

		for (var k = 0; k < orgArr.length; k++) {
        	var orgDn = orgArr[k];
        
            logger.addInfo("orgDn : " + orgDn);

            // collect all vnic templates for org
			for (var i = 0; i < vnicTemplListForAcc.size(); i++) {
            	var templ  = vnicTemplListForAcc.get(i);
                if (templ.getDn() != null) {
                    if ((templ.getSwitchId() != null)
                            && (templ.getSwitchId().startsWith(switchId) || switchId.equals("dual")))
                    {
                        logger.addInfo("template switch ID : " + templ.getSwitchId());
                        logger.addInfo("vlan switch ID : " + switchId);

                        if ((templ.getOrg() != null) && templ.getOrg().equals(orgDn))
                        {
                            if ((templ.getTemplType() != null)
                                    && templ.getTemplType().equals(UcsConstants.SERVICE_PROFILE_TYPE_INITIAL_TEMPLATE))
                            {
                                logger.addInfo("Template : " + templ.getDn() + " Type : " + templ.getTemplType());
                                initTemplMap.put(templ.getDn(), templ);
                            } else if (templ.getTemplType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                            {
                                logger.addInfo("Template : " + templ.getDn() + " Type : " + templ.getTemplType());
                                updTemplMap.put(templ.getDn(), templ);
                            }
                        }
                    }
                }
            }

            // collect all org level SPs
			for (var i = 0; i < spListForAcc.size(); i++) {
            	var sp = spListForAcc.get(i);
                if ((sp.getOrgName() != null) && sp.getOrgName().equals(orgDn)){
                    logger.addInfo("SP : " + sp.getDn());
                    spMap.put(sp.getDn(), sp);
                }
            }
        } // end of orgArr

        // ..................logger...............................
        logger.addInfo("Size of Initial template map for orglist  : " + initTemplMap.size());

        var j = 1;
        var i = initTemplMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of Updating template map for orglist : " + updTemplMap.size());
        j = 1;
        i = updTemplMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of SP Map for orglist  : " + spMap.size());
        j = 1;
        i = spMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());
		
		var arr = spMap.values().toArray();
        for (var m = 0; m < arr.length; m++) {
        	var sp = arr[m];
            if (sp.getDn() != null) {
                if ((sp.getSrcTemplName() != null) && (sp.getSrcTemplName().length() > 0))
                {
                    var assocSPTempl = getAssocSPTempl(accountName, sp);

                    if (assocSPTempl != null)
                    {
                        if (assocSPTempl.getType().equals(UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                        {
                            if (spMap.containsKey(assocSPTempl.getDn()))
                            {
                                unwantedSpMap.put(sp.getDn(), sp);
                            } else
                            {
                                unbindSpMap.put(sp.getDn(), sp);
                            }
                        }
                    }
                }
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of unwantedSpMap  : " + unwantedSpMap.size());
        j = 1;
        i = unwantedSpMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of unbindSpMap  : " + unbindSpMap.size());
        j = 1;
        i = unbindSpMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // ..................logger...............................

        // remove SPs which are bound to updating SP Templ and the template is part of org selection
        i = unwantedSpMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();

            if (spMap.containsKey(key))
            {
                spMap.remove(key);
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of SP map after removing unwanted SPs : " + spMap.size());
        j = 1;
        i = spMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // ..................logger...............................

        // collect sp vnics
		var arr = spMap.values().toArray();
        for (var m = 0; m < arr.length; m++) {
        	var sp = arr[m];
            // initCount = uptCount = normalVnicCount = 0;
            if (sp.getSpVNIC() == null) {
                continue;
            }
			
			for (var k = 0; k <  sp.getSpVNIC().size(); k++) {
            	var spVnic = sp.getSpVNIC().get(k);            
                if ((spVnic.getSwitchId() != null)
                        && (spVnic.getSwitchId().startsWith(switchId) || switchId.equals("dual"))) {
                    // cannot add vlan to dynamic vnics
                    if ((spVnic.getInstType() != null) && !spVnic.getInstType().equals("dynamic")) {
                        spVnicMap.put(spVnic.getDn(), spVnic); // add sp vnic to map
                        logger.addInfo("SP VNIC : " + spVnic.getDn());

                        if ((spVnic.getNwTemplName() != null) && (spVnic.getSrcTemplDn() != null)
                                && (spVnic.getSrcTemplDn().length() > 0) && (spVnic.getNwTemplName().length() > 0))
                        {
                            var assocVNICTempl = getVnicFromList(vnicTemplListForAcc,spVnic.getSrcTemplDn());
                            ;

                            if (assocVNICTempl != null)
                            {
                                if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_INITIAL_TEMPLATE))
                                {
                                    // unbind this vnic from template before adding vlan
                                    unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());
                                    logger.addInfo("Unbind Template");
                                } else if (assocVNICTempl.getTemplType().equals(
                                        UcsConstants.SERVICE_PROFILE_TYPE_UPDATING_TEMPLATE))
                                {
                                    logger.addInfo("Template DN : " + assocVNICTempl.getDn() + " Type : "
                                            + assocVNICTempl.getTemplType());

                                    if (updTemplMap.containsKey(assocVNICTempl.getDn()))
                                    {
                                        logger.addInfo("Remove SP vnic from MAP");
                                        unwantedSpVnicMap.put(spVnic.getDn(), spVnic);
                                    } else
                                    {
                                        logger.addInfo("Unbind Template");
                                        unBindVnicSPMap.put(spVnic.getDn(), spVnic);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } // end of //collect all the sps which have associated vnic templates

        // ..................logger...............................
        logger.addInfo("Size of unwantedSpVnicMap : " + unwantedSpVnicMap.size());
        j = 1;
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of SP VNIC MAP : " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("Size of SPs that need to be unbound : " + unBindVnicSPMap.size());
        j = 1;
        i = unBindVnicSPMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();
            logger.addInfo(j++ + "Src Templ Dn : " + key + "  vnic templ Dn : " + unBindVnicSPMap.get(key).getDn());
            ;
        }

        // remove these sp vnics from the total sp vnic list as it is enough to modify the updating
        // vnic templ
        i = unwantedSpVnicMap.keySet().iterator();

        while (i.hasNext())
        {
            var key =   i.next();

            if (spVnicMap.containsKey(key))
            {
                spVnicMap.remove(key);
            }
        }

        // ..................logger...............................
        logger.addInfo("Size of SP VNIC MAP after removing unwanted sp vnics: " + spVnicMap.size());
        j = 1;
        i = spVnicMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        // combine into single template map
        templMap.putAll(initTemplMap);
        templMap.putAll(updTemplMap);

        // ..................logger...............................
        logger.addInfo("Final vnic templ size : " + templMap.size());
        j = 1;
        i = templMap.keySet().iterator();

        while (i.hasNext())
            logger.addInfo(j++ + " " +   i.next());

        logger.addInfo("End of collectObjectsToAddVLAN()");

        // ..................logger...............................
    }

    function getAssocSPTempl(accountName, sp) {
        var spTemplList = UcsDataPersistenceUtil.getSPTemplByNameAndHier(accountName,sp.getOrgName(), sp.getSrcTemplName());
        var assocSPTempl = null;

        if ((spTemplList != null) && (spTemplList.size() > 0))
        {
            logger.addInfo("Assoc TemplList size : " + spTemplList.size());

            if (spTemplList.size() == 1)
            {
                assocSPTempl = spTemplList.get(0);
            } else if (spTemplList.size() > 1)
            {
                var orgLevel = 0;
				for (var i = 0; i < spTemplList.size(); i++) {
                	var spTempl = spTemplList.get(i);
                    var arr = spTempl.getOrgName().split("/");

                    if (arr.length > orgLevel)
                    {
                        assocSPTempl = spTempl;
                        orgLevel = arr.length;
                        logger.addInfo("Assoc Templ Dn : " + assocSPTempl.getDn());
                    }
                }
            }
        }
//        logger.addInfo("templ type:" + assocSPTempl.getName() + ";;;;;" + assocSPTempl.getType());
        return assocSPTempl;
    }

    function createRequestToUnbindSPFromTemplate(unbindSpMap,
            uniqueId,  logList, context,
            entryList, chList) {
        var lsServerList = new ArrayList();
        var i = unbindSpMap.keySet().iterator();

        while (i.hasNext())
        {
            var spDn =   i.next();
            var sp = unbindSpMap.get(spDn);
            var ls = new LsServer();
            ls.setDn(sp.getDn());
            ls.setSrcTemplName(""); // unbound vnic templ from sp vnic
            lsServerList.add(ls);

            var log = new UCSAddVLANToSPLog();
            log.setType(UCSAddVLANToSPLog.BIND_SP);
            log.setTarget(sp.getSrcTemplName());
            log.setDn(sp.getDn());
            log.setAccountName(sp.getAccountName());
            // log.setConfigEntryId(configEntryID);
            log.setUniqueId(uniqueId);
            logList.add(log);

            try
            {
                logger.addInfo("in createRequestToUnbindSPFromTemplate : " + logList);
                if (!context.isRESTContext())
                {
                    entryList.add(resourceChange(UcsAssetTypeConstants.UCS_SERVICE_PROFILE, sp.getIdentityKey(), sp
                            .getDn(), "Service Profile is unbound from Service Profile Template : "
                            + sp.getSrcTemplName(), context));
                }
                chList.add(createCMDBRecord1(
                        "Service Profile is unbound from Service Profile Template : " + sp.getSrcTemplName(),
                        context.getUserId(), sp));
            } catch (e)
            {
                logger.addError("Error in  resource tracking and CMDB"+ e.message);
            }
        }

        return lsServerList;
    }

    function resourceChange(assetType, assetId, assetLabel,
            assetDesc, context) {    	
        var e = context.getChangeTracker().createChangeEntry();
        e.setChangeType(ServiceRequestAssetChangeEntry.CHANGE_TYPE_MODIFY);
        e.setChangeDescription(assetDesc);
        e.setAssetType(assetType);
        e.setAssetId(assetId);
        e.setAssetLabel(assetLabel);

        return e;

        // assetList.add(e);
    }

    function  addChangeRecord(userId, vlan, changeType, accountName) {
        try
        {
            var lan = UcsDataPersistenceUtil.getVLAN(accountName, vlan.getDn());
            UcsCMDBUtil.getInstance().change(userId, changeType, null, lan);
        } catch (e)
        {
            logger.addError("Error while creating change record"+ e.message);
        }
    }

    function createCMDBRecord1(descrption, user, sp)
    {
        var ai = new CMDB.AdditionalInfo();
        var rec = new ChangeRecord();
        rec.setTime(System.currentTimeMillis());

        if (sp.getType().equals(GlobalConstants.FIELD_CONSTANTS.SERVICE_PROFILE_TYPE_INTANCE))
        {
            rec.setResourceType(ChangeRecord.RES_TYPE_UCS_SERVICE_PROFILE);
        } else
        {
            rec.setResourceType(ChangeRecord.RES_TYPE_UCS_SERVICE_PROFILE_TEMPLATE);
        }

        rec.setDescription(descrption);
        rec.setChangeType(ChangeRecord.CHANGE_TYPE_MODIFY);
        rec.setChangeByUser(user);

        rec.setChangedResourceName(sp.getDn());

        ai.add("Account Name", sp.getAccountName());
        ai.add("Organization", UcsDataPersistenceUtil.getOrgFromDn(sp.getDn()));
        ai.add("Associate Status", sp.getAssocState());
        ai.add("Operational Status", sp.getOperState());
        ai.add("Number of vHBAs", (sp.getSpVHBA() != null) ? (sp.getSpVHBA().size() + "") : "0");
        ai.add("Number of vNICs", (sp.getSpVNIC() != null) ? (sp.getSpVNIC().size() + "") : "0");
        rec.setAdditionalInfo(ai.toString());

        return rec;
    }

    function createCMDBRecord(descrption, user, obj) {
    
        var ai = new CMDB.AdditionalInfo();
        var rec = new ChangeRecord();
        rec.setTime(System.currentTimeMillis());
        rec.setResourceType(ChangeRecord.RES_TYPE_UCS_VNIC_TEMPLATE);
        rec.setDescription(descrption);
        rec.setChangeType(ChangeRecord.CHANGE_TYPE_MODIFY);
        rec.setChangeByUser(user);

        rec.setChangedResourceName(obj.getDn());

        ai.add("Account Name", obj.getAccountName());
        ai.add("Template Type", obj.getTemplType());
        ai.add("Switch ID", obj.getSwitchId());
        rec.setAdditionalInfo(ai.toString());

        return rec;
    }
    
    
    function modifyVLANOrgList(orgList, vlanName, accountName,context) {
        var finalVlanList = new ArrayList();
        var chList = new ArrayList();
        if (orgList != null) {
            var finalList = new ArrayList();
            var configList = orgList.split(",");
            if (configList != null && configList.length > 0)
                for (var i = 0; i < configList.length; i++) {
					var c = configList[i];
					finalList.add(c);
                }

            logger.addInfo("Final List size:" + finalList.size());
			for (var i = 0; i < finalList.size(); i++) {
            	var name = finalList.get(i);
                var finalVlan = new UcsVlanGroupMappings();
                finalVlan.setName(vlanName);
                finalVlan.setAccountName(accountName);
                // org-root/org-Finance/vlan-req-vlanA
                var rn = "/vlan-req-";
                finalVlan.setObjType("vlan");
                finalVlan.setDn(name + rn + vlanName);
                finalVlan.setStatus(UcsAPIConstants.MANAGED_OBJECT_STATUS_CREATED_MODIFIED);
                finalVlan.setType("lan");
                finalVlanList.add(finalVlan);
                chList.add(createCMDBRecords("Created VLAN on " + finalVlan.getDn(), context.getUserId(), finalVlan, ChangeRecord.CHANGE_TYPE_DELETE));
            }

            logger.addInfo("finalVlanList : " + finalVlanList.size());
            UcsAPIActions.performVlanGroupingOrgMappingsAction(finalVlanList, accountName, "admin", chList);
        }
    }

        
function createCMDBRecords(text, userId, finalVlan, changeTypeDelete) {
	var ai = new CMDB.AdditionalInfo();
	var rec = new ChangeRecord();
	rec.setTime(System.currentTimeMillis());
	rec.setResourceType(ChangeRecord.RES_TYPE_UCS_FAULT_SUPPRESSION_TASK);
	rec.setDescription(text);
	rec.setChangeType(changeTypeDelete);//ChangeRecord.CHANGE_TYPE_MODIFY);
	rec.setChangeByUser(userId);

	rec.setChangedResourceName(finalVlan.getDn());

	ai.add("Account Name", finalVlan.getAccountName());
	ai.add("DN", finalVlan.getDn());
	ai.add("Status", finalVlan.getStatus());
	ai.add("Organization", finalVlan.getOrgDn());
	rec.setAdditionalInfo(ai.toString());
	return rec;

}
function setVLANSharing(vlan, sharing, pubNwName) {
	if(sharing != null && !(new java.lang.String(sharing)).isEmpty())
	{
	   if(sharing.equals("None"))
		   vlan.setSharing("none");
	   else if(sharing.equals("Primary"))
	   {
		   vlan.setSharing("primary");
	   }
	   else if(sharing.equals("Isolated"))
	   {
		   vlan.setSharing("isolated");
		   if(sharing != null)
			   vlan.setPubNwName(pubNwName);
	   }
	   else
		   vlan.setSharing("none");
	}
}

function getOrgList(orgList) {
	var orgListBuf = new StringBuffer();
	if(orgList == null || orgList.trim().equals("")){
		return orgList;
	}
	if (orgList.indexOf(",") != -1) {
		var arr = orgList.split(",");
		for (var i = 0; i < arr.length; i++) {
			var arr1 = arr[i];
			if (arr1.indexOf(";") != -1) {
				orgListBuf.append(arr1.split(";")[1]);				
			} else {
				orgListBuf.append(arr1);
			}			
			orgListBuf.append(",");
		}
		orgListBuf.deleteCharAt(orgListBuf.toString().lastIndexOf(","));
	} else {
		if (orgList.indexOf(";") != -1) {
			orgListBuf.append(orgList.split(";")[1]);				
		} else {
			orgListBuf.append(orgList);
		}		
	}
	orgList = orgListBuf.toString();
	return orgList;
}

function getServiceProfileList(list){
	
	var srListBuf = new StringBuffer();
	if(list == null || list.trim().equals("")){
		//return orgList;
		return list;
	}
	if(list.indexOf(",") != -1){
		var listArr = list.split(",");
		for (var i = 0; i < listArr.length; i++) {
			var bufString = listArr[i].substring(listArr[i].lastIndexOf(";")+1);
			srListBuf.append(bufString);
			srListBuf.append(",");
		}
		srListBuf.deleteCharAt(srListBuf.toString().lastIndexOf(","));
	} else {
		var bufString = list.substring(list.lastIndexOf(";")+1);
		srListBuf.append(bufString);
	}
	return srListBuf.toString();
}
	
executeCustomAction();
    

Additional Links: