// Error recovery must be added to this method protected void btnSaveChange_Click(object sender, EventArgs e) { int id = int.Parse(ddlLabClient.SelectedValue); if (id > 0) { LabClient[] clients = wrapper.GetLabClientsWrapper(new int[] { id }); if (clients.Length > 0 && clients[0].clientID > 0) { theClient = clients[0]; } } // objects used in try block may be required for recovery if errors bool noError = true; ProcessAgentInfo labServer = null; ProcessAgentInfo uss = null; ProcessAgentInfo lss = null; long rmUss = 0; lblResponse.Visible = false; lblResponse.Text = ""; try { if (ddlUserGroup.SelectedIndex <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("Please select a user group from the corresponding drop-down list."); return; } int groupID = Convert.ToInt32(ddlUserGroup.SelectedValue); if (groupID <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("The user group is invalid."); return; } //Get the user Group Name to be displayed in the repeater Group[] userGroup = wrapper.GetGroupsWrapper(new int[] { groupID }); string userGroupName = userGroup[0].GroupName; if (theClient.labServerIDs != null && theClient.labServerIDs.Length > 0) { labServer = issuer.GetProcessAgentInfo(theClient.labServerIDs[0]); } if (labServer == null) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("Lab Client should first be associated with a Lab Server"); return; } if (theClient.needsScheduling) { if (ddlAdminGroup.SelectedIndex <= 0 || ddlUserGroup.SelectedIndex <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("Please select a user and management group from the corresponding drop-down lists."); return; } int manageID = Convert.ToInt32(ddlAdminGroup.SelectedValue); if (manageID <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("The management group is invalid."); return; } int ussId = issuer.FindProcessAgentIdForClient(theClient.clientID, ProcessAgentType.SCHEDULING_SERVER); if (ussId <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("Lab Client should first be associated with a USS"); return; } int lssId = issuer.FindProcessAgentIdForAgent(theClient.labServerIDs[0], ProcessAgentType.LAB_SCHEDULING_SERVER); if (lssId <= 0) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatWarningMessage("Lab Server should first be associated with an LSS"); return; } else { uss = issuer.GetProcessAgentInfo(ussId); if (uss.retired) { throw new Exception("The USS is retired"); } lss = issuer.GetProcessAgentInfo(lssId); if (lss.retired) { throw new Exception("The LSS is retired"); } //Object keyObj = groupID; //string keyType = ResourceMappingTypes.GROUP; ResourceMappingKey key = new ResourceMappingKey(ResourceMappingTypes.GROUP, groupID); ResourceMappingValue[] values = new ResourceMappingValue[3]; values[0] = new ResourceMappingValue(ResourceMappingTypes.CLIENT, theClient.clientID); values[1] = new ResourceMappingValue(ResourceMappingTypes.TICKET_TYPE, TicketTypes.GetTicketType(TicketTypes.MANAGE_USS_GROUP)); values[2] = new ResourceMappingValue(ResourceMappingTypes.GROUP,manageID); //values[0] = new ResourceMappingValue(ResourceMappingTypes.RESOURCE_TYPE, ProcessAgentType.SCHEDULING_SERVER); //values[1] = new ResourceMappingValue(ResourceMappingTypes.PROCESS_AGENT, ussId); ResourceMapping newMapping = issuer.AddResourceMapping(key, values); rmUss = newMapping.MappingID; // add mapping to qualifier list int qualifierType = Qualifier.resourceMappingQualifierTypeID; string name = issuer.ResourceMappingToString(newMapping); int qualifierID = AuthorizationAPI.AddQualifier(newMapping.MappingID, qualifierType, name, Qualifier.ROOT); //Give the Manager Group a Grant "MANAGE_USS_GROUP" on the created resource mapping string function = Function.manageUSSGroup; int grantID = wrapper.AddGrantWrapper(manageID, function, qualifierID); //Get the management Group Name to be displayed in the repeater Group[] adminGroup = wrapper.GetGroupsWrapper(new int[] { manageID }); string adminGroupName = adminGroup[0].GroupName; //Create the Map between user and management group GroupManagerUserMap groupMap = new GroupManagerUserMap(adminGroupName, userGroupName, grantID, newMapping.MappingID); TicketLoadFactory factory = TicketLoadFactory.Instance(); //long duration = 60; // Get this SB's domain Guid string domainGuid = ProcessAgentDB.ServiceGuid; string sbName = ProcessAgentDB.ServiceAgent.agentName; //Add Credential set on the USS //string ussPayload = factory.createAdministerUSSPayload(Convert.ToInt32(Session["userTZ"])); //Coupon ussCoupon = issuer.CreateTicket(TicketTypes.ADMINISTER_USS, uss.agentGuid, // issuer.GetIssuerGuid(), duration, ussPayload); UserSchedulingProxy ussProxy = new UserSchedulingProxy(); ussProxy.Url = uss.webServiceUrl; ussProxy.AgentAuthHeaderValue = new AgentAuthHeader(); ussProxy.AgentAuthHeaderValue.coupon = uss.identOut; ussProxy.AgentAuthHeaderValue.agentGuid = domainGuid; ussProxy.AddCredentialSet(domainGuid, sbName, userGroupName); // Check for existing RevokeReservation ticket redeemer = USS, sponsor = LSS Coupon[] revokeCoupons = issuer.RetrieveIssuedTicketCoupon( TicketTypes.REVOKE_RESERVATION, uss.agentGuid, lss.agentGuid); Coupon revokeCoupon = null; if (revokeCoupons != null && revokeCoupons.Length > 0) { revokeCoupon = revokeCoupons[0]; } else { // Create RevokeReservation ticket revokeCoupon = issuer.CreateTicket(TicketTypes.REVOKE_RESERVATION, uss.agentGuid, lss.agentGuid, -1L, factory.createRevokeReservationPayload()); } //Add Credential set on the LSS // check if this domain if (ProcessAgentDB.ServiceGuid.Equals(lss.domainGuid)) { LabSchedulingProxy lssProxy = new LabSchedulingProxy(); lssProxy.Url = lss.webServiceUrl; lssProxy.AgentAuthHeaderValue = new AgentAuthHeader(); lssProxy.AgentAuthHeaderValue.coupon = lss.identOut; lssProxy.AgentAuthHeaderValue.agentGuid = domainGuid; // Add the USS to the LSS, this may be called multiple times with duplicate data lssProxy.AddUSSInfo(uss.AgentGuid, uss.agentName, uss.webServiceUrl, revokeCoupon); int credentialSetAdded = lssProxy.AddCredentialSet(domainGuid, sbName, userGroupName, uss.agentGuid); } else { // Cross-Domain Registration needed ProcessAgentInfo remoteSB = issuer.GetProcessAgentInfo(lss.domainGuid); if(remoteSB.retired){ throw new Exception("The remote service broker is retired"); } ResourceDescriptorFactory resourceFactory = ResourceDescriptorFactory.Instance(); string ussDescriptor = resourceFactory.CreateProcessAgentDescriptor(ussId); string lssDescriptor = resourceFactory.CreateProcessAgentDescriptor(lssId); string groupDescriptor = resourceFactory.CreateGroupCredentialDescriptor(domainGuid, sbName, userGroupName, uss.agentGuid, lss.agentGuid); ServiceDescription[] info = new ServiceDescription[3]; info[0] = new ServiceDescription(null, revokeCoupon, ussDescriptor); info[1] = new ServiceDescription(null, null, lssDescriptor); info[2] = new ServiceDescription(null, null, groupDescriptor); ProcessAgentProxy sbProxy = new ProcessAgentProxy(); sbProxy.AgentAuthHeaderValue = new AgentAuthHeader(); sbProxy.AgentAuthHeaderValue.agentGuid = domainGuid; sbProxy.AgentAuthHeaderValue.coupon = remoteSB.identOut; sbProxy.Url = remoteSB.webServiceUrl; sbProxy.Register(Utilities.MakeGuid(), info); } } } /*Update Lab Client grants*/ //Get qualifier for labclient int lcQualifierID = AuthorizationAPI.GetQualifierID(theClient.clientID, Qualifier.labClientQualifierTypeID); //Get all "uselabclient" grants for this labclient int[] lcGrantIDs = wrapper.FindGrantsWrapper(-1, Function.useLabClientFunctionType, lcQualifierID); Grant[] lcGrants = wrapper.GetGrantsWrapper(lcGrantIDs); //Get list of agents that can use labclient ArrayList lcAgents = new ArrayList(); foreach (Grant g in lcGrants) lcAgents.Add(g.agentID); //if that agent doesn't already have the uselabclient permission if (!lcAgents.Contains(groupID)) //add lab client grant wrapper.AddGrantWrapper(groupID, Function.useLabClientFunctionType, lcQualifierID); /*Update Lab Servers grant*/ //Update grants for each of the associated lab servers foreach (int lsID in theClient.labServerIDs) { //Get qualifier for labserver int lsQualifierID = AuthorizationAPI.GetQualifierID(lsID, Qualifier.labServerQualifierTypeID); //Get all "uselabserver" grants for this labserver int[] lsGrantIDs = wrapper.FindGrantsWrapper(-1, Function.useLabServerFunctionType, lsQualifierID); Grant[] lsGrants = wrapper.GetGrantsWrapper(lsGrantIDs); //Get list of agents that can use labserver ArrayList lsAgents = new ArrayList(); foreach (Grant g in lsGrants) lsAgents.Add(g.agentID); //int groupID = Convert.ToInt32(ddlUserGroup.SelectedValue); //if that agent doesn't already have the uselabclient permission if (!lsAgents.Contains(groupID)) //add lab server grant wrapper.AddGrantWrapper(groupID, Function.useLabServerFunctionType, lsQualifierID); } //Refresh the repeater RefreshAdminUserGroupsRepeater(); LoadListBoxes(); lblResponse.Visible = true; lblResponse.Text = Utilities.FormatConfirmationMessage("Lab client (& corresponding lab servers) successfully updated. "); } catch (Exception ex) { lblResponse.Visible = true; lblResponse.Text = Utilities.FormatErrorMessage("Cannot update Lab Client. " + ex.GetBaseException()); } }
protected void repAdminUserGroups_ItemCommand_ORIG(object source, RepeaterCommandEventArgs e) { //RefreshAdminUserGroupsRepeater(); adminGroupUserList = GetGroupManagerUserMaps(); int labServerID = 0; try { if (e.CommandName.Equals("Remove")) { //example:issuer.DeleteAdminURL(Int32.Parse(e.CommandArgument.ToString())) string userGroupName = e.CommandArgument.ToString(); int userGroupID = wrapper.GetGroupIDWrapper(userGroupName); string clientFunction = Function.useLabClientFunctionType; string labFunction = Function.useLabServerFunctionType; if (theClient.clientID > 0) { //if (theClient.needsScheduling) //{ string managerGroupName = null; int mapGrantID = 0, mapResourceMappingID = 0; GroupManagerUserMap groupMap = new GroupManagerUserMap(); for (int i = 0; i < adminGroupUserList.Count; i++) { groupMap = (GroupManagerUserMap)adminGroupUserList[i]; if (groupMap.UserGroupName.Equals(userGroupName)) { managerGroupName = groupMap.ManagerGroupName; mapGrantID = groupMap.GrantID; mapResourceMappingID = groupMap.ResourceMappingID; break; } } //delete Grant [Manager Group] -> [MANAGE_USS_GROUP] -> [Rsrc Mapping{[User Group] <-> [USS]}] if (mapGrantID > 0) wrapper.RemoveGrantsWrapper(new int[] { mapGrantID }); //delete Resource Mapping [User Group] <-> [USS] if (mapResourceMappingID > 0) issuer.DeleteResourceMapping(issuer.GetResourceMapping(mapResourceMappingID)); //} End needs scheduling //delete the Grant [User Group] -> USE LAB CLIENT -> lab client int clientQualifierID = AuthorizationAPI.GetQualifierID(theClient.clientID, Qualifier.labClientQualifierTypeID); if (clientQualifierID > 0) { int[] clientGrants = wrapper.FindGrantsWrapper(userGroupID, clientFunction, clientQualifierID); if ((clientGrants != null) && (clientGrants.Length > 0) && (clientGrants[0] > 0)) wrapper.RemoveGrantsWrapper(new int[] { clientGrants[0] }); if ((theClient.labServerIDs != null) && (theClient.labServerIDs.Length > 0) && (theClient.labServerIDs[0] > 0)) { labServerID = theClient.labServerIDs[0]; int remainingClients = AdministrativeAPI.CountServerClients(userGroupID, labServerID); if (remainingClients == 0) { //delete the Grant [User Group] -> USE LAB SERVER -> lab Server int labQualifierID = AuthorizationAPI.GetQualifierID(labServerID, Qualifier.labServerQualifierTypeID); if (labQualifierID > 0) { int[] labGrants = (wrapper.FindGrantsWrapper(userGroupID, labFunction, labQualifierID)); if ((labGrants != null) && (labGrants.Length > 0) && (labGrants[0] > 0)) wrapper.RemoveGrantsWrapper(new int[] { labGrants[0] }); } } } } } RefreshAdminUserGroupsRepeater(); LoadListBoxes(); } } catch (Exception exc) { Utilities.WriteLog(exc.Message); } }