public void CreateResource(AcmaResource resource) { try { Monitor.Enter(ServiceMain.Lock); if (resource.ObjectID == Guid.Empty) { resource.ObjectID = new Guid(); } CSEntryChange csentry = CSEntryChangeDetached.Create(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.DN = resource.ObjectID.ToString(); csentry.ObjectType = resource.ObjectType; foreach (var item in resource.Attributes) { csentry.AttributeChanges.Add(this.AvpToAttributeChange(item, AttributeModificationType.Add)); } bool refRetry; CSEntryExport.PutExportEntry(csentry, out refRetry); } finally { Monitor.Exit(ServiceMain.Lock); } }
public override void Execute() { bool refRetryRequired = false; this.PrepCSEntryChange(); CSEntryExport.PutExportEntry(this.CSEntryChange, out refRetryRequired); if (refRetryRequired) { throw new ReferencedObjectNotPresentException(); } }
public void DeleteResource(string id) { try { Monitor.Enter(ServiceMain.Lock); CSEntryChange csentry = CSEntryChangeDetached.Create(); csentry.ObjectModificationType = ObjectModificationType.Delete; csentry.DN = id; bool refRetry; CSEntryExport.PutExportEntry(csentry, out refRetry); } finally { Monitor.Exit(ServiceMain.Lock); } }
public ExportResponse ExportPage(ExportRequest request) { try { Monitor.Enter(ServiceMain.Lock); ExportResponse response = new ExportResponse(); response.Results = new List <CSEntryChangeResult>(); IList <AttributeChange> anchorchanges; foreach (CSEntryChange csentryChange in request.CSEntryChanges) { try { bool referenceRetryRequired; anchorchanges = CSEntryExport.PutExportEntry(csentryChange, out referenceRetryRequired); if (referenceRetryRequired) { Logger.WriteLine(string.Format("Reference attribute not available for csentry {0}. Flagging for retry", csentryChange.DN)); response.Results.Add(CSEntryChangeResult.Create(csentryChange.Identifier, anchorchanges, MAExportError.ExportActionRetryReferenceAttribute)); } else { response.Results.Add(CSEntryChangeResult.Create(csentryChange.Identifier, anchorchanges, MAExportError.Success)); } } catch (Exception ex) { MAStatistics.AddExportError(); response.Results.Add(this.GetExportChangeResultFromException(csentryChange, ex)); } } return(response); } finally { Monitor.Exit(ServiceMain.Lock); } }
public void ReplaceResource(string id, AcmaResource resource) { try { Monitor.Enter(ServiceMain.Lock); CSEntryChange csentry = CSEntryChangeDetached.Create(); csentry.ObjectModificationType = ObjectModificationType.Replace; csentry.DN = id; foreach (var item in resource.Attributes) { csentry.AttributeChanges.Add(this.AvpToAttributeChange(item, AttributeModificationType.Add)); } bool refRetry; CSEntryExport.PutExportEntry(csentry, out refRetry); } finally { Monitor.Exit(ServiceMain.Lock); } }
public void ExportCSEntryChangeDelete() { Guid id = Guid.NewGuid(); CSEntryChange csentry = CSEntryChange.Create(); csentry.DN = id.ToString(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.ObjectType = "person"; csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mail", "*****@*****.**")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mailAlternateAddresses", new List <object> { "*****@*****.**", "*****@*****.**" })); try { bool refretry; CSEntryExport.PutExportEntry(csentry, out refretry); csentry = CSEntryChange.Create(); csentry.DN = id.ToString(); csentry.ObjectModificationType = ObjectModificationType.Delete; csentry.ObjectType = "person"; AcmaSchemaObjectClass objectClass = ActiveConfig.DB.GetObjectClass("person"); CSEntryExport.PutExportEntry(csentry, out refretry); MAObjectHologram sourceObject = ActiveConfig.DB.GetMAObject(id, objectClass); if (sourceObject.DeletedTimestamp == 0) { Assert.Fail("The object was not deleted"); } } finally { ActiveConfig.DB.DeleteMAObjectPermanent(id); } }
public override void Execute() { if (this.CSEntryChange.ObjectModificationType != ObjectModificationType.Add) { if (this.CSEntryChange.ObjectModificationType == ObjectModificationType.Unconfigured) { this.CSEntryChange.ObjectModificationType = ObjectModificationType.Add; } else { throw new InvalidOperationException(string.Format("The CSEntryChange in unit test step {0} contained an invalid modification type", this.Name)); } } bool refRetryRequired = false; CSEntryExport.PutExportEntry(this.CSEntryChange, out refRetryRequired); if (refRetryRequired) { throw new ReferencedObjectNotPresentException(); } }
public void ExportCSEntryChangeAdd() { Guid id = Guid.NewGuid(); CSEntryChange csentry = CSEntryChange.Create(); csentry.DN = id.ToString(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.ObjectType = "person"; csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mail", "*****@*****.**")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mailAlternateAddresses", new List <object> { "*****@*****.**", "*****@*****.**" })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("unixUid", 44L)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("expiryDates", new List <object>() { 55L, 66L, 77L })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("directReports", new List <object>() { new Guid("{8FC92471-7835-4804-8BBB-0A5ED7078074}"), new Guid("{0EF7CC21-729E-4ED9-A3AF-8203796334C6}") })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("supervisor", new Guid("{2807ED76-E262-4EB4-ABD9-9629F3830F12}"))); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("connectedToSap", true)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("dateTimeMV", new List <object>() { DateTime.Parse("2010-01-01"), DateTime.Parse("2011-01-01") })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("dateTimeSV", DateTime.Parse("2012-01-01"))); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSids", new List <object>() { new byte[] { 0, 1, 2, 3, 4, 5 }, new byte[] { 2, 4, 6, 8, 0 } })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSid", new byte[] { 0, 1, 2, 3, 4 })); AcmaSchemaObjectClass objectClass = ActiveConfig.DB.GetObjectClass("person"); try { bool refretry; CSEntryExport.PutExportEntry(csentry, out refretry); MAObjectHologram sourceObject = ActiveConfig.DB.GetMAObject(id, objectClass); if (sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("mail")).ValueString != "*****@*****.**") { Assert.Fail("One or more attribute changes were not committed"); } if (sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("dateTimeSV")).ValueDateTime != DateTime.Parse("2012-01-01")) { Assert.Fail("One or more attribute changes were not committed"); } if (sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("unixUid")).ValueLong != 44L) { Assert.Fail("One or more attribute changes were not committed"); } if (sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("connectedToSap")).ValueBoolean != true) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("objectSid")).ValueByte.SequenceEqual(new byte[] { 0, 1, 2, 3, 4 })) { Assert.Fail("One or more attribute changes were not committed"); } if (sourceObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("supervisor")).ValueGuid != new Guid("{2807ED76-E262-4EB4-ABD9-9629F3830F12}")) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetMVAttributeValues(ActiveConfig.DB.GetAttribute("mailAlternateAddresses")).ContainsAllElements(new List <object> { "*****@*****.**", "*****@*****.**" })) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetMVAttributeValues(ActiveConfig.DB.GetAttribute("expiryDates")).ContainsAllElements(new List <object>() { 55L, 66L, 77L })) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetMVAttributeValues(ActiveConfig.DB.GetAttribute("dateTimeMV")).ContainsAllElements(new List <object>() { DateTime.Parse("2010-01-01"), DateTime.Parse("2011-01-01") })) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetMVAttributeValues(ActiveConfig.DB.GetAttribute("directReports")).ContainsAllElements(new List <object>() { new Guid("{8FC92471-7835-4804-8BBB-0A5ED7078074}"), new Guid("{0EF7CC21-729E-4ED9-A3AF-8203796334C6}") })) { Assert.Fail("One or more attribute changes were not committed"); } if (!sourceObject.GetMVAttributeValues(ActiveConfig.DB.GetAttribute("objectSids")).ContainsAllElements(new List <object>() { new byte[] { 0, 1, 2, 3, 4, 5 }, new byte[] { 2, 4, 6, 8, 0 } })) { Assert.Fail("One or more attribute changes were not committed"); } } finally { ActiveConfig.DB.DeleteMAObjectPermanent(id); } }
public void ExportCSEntryChangeAddResurrect() { Guid originalId = Guid.NewGuid(); Guid replacementId = Guid.NewGuid(); if (!ActiveConfig.XmlConfig.ClassConstructors.Contains("person")) { ActiveConfig.XmlConfig.ClassConstructors.Add(new ClassConstructor() { ObjectClass = ActiveConfig.DB.GetObjectClass("person") }); } ActiveConfig.XmlConfig.ClassConstructors["person"].ResurrectionParameters = new DBQueryGroup(); ActiveConfig.XmlConfig.ClassConstructors["person"].ResurrectionParameters.Operator = GroupOperator.Any; DBQueryByValue query = new DBQueryByValue(ActiveConfig.DB.GetAttribute("sapPersonId"), ValueOperator.Equals, ActiveConfig.DB.GetAttribute("sapPersonId")); ActiveConfig.XmlConfig.ClassConstructors["person"].ResurrectionParameters.DBQueries.Add(query); CSEntryChange csentry = CSEntryChange.Create(); csentry.DN = originalId.ToString(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.ObjectType = "person"; csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mail", "*****@*****.**")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mailAlternateAddresses", new List <object> { "*****@*****.**", "*****@*****.**" })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("unixUid", 44L)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("expiryDates", new List <object>() { 55L, 66L, 77L })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("directReports", new List <object>() { new Guid("{8FC92471-7835-4804-8BBB-0A5ED7078074}"), new Guid("{0EF7CC21-729E-4ED9-A3AF-8203796334C6}") })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("supervisor", new Guid("{2807ED76-E262-4EB4-ABD9-9629F3830F12}"))); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("connectedToSap", true)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSids", new List <object>() { new byte[] { 0, 1, 2, 3, 4, 5 }, new byte[] { 2, 4, 6, 8, 0 } })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSid", new byte[] { 0, 1, 2, 3, 4 })); try { bool refretry; CSEntryExport.PutExportEntry(csentry, out refretry); AcmaSchemaObjectClass objectClass = ActiveConfig.DB.GetObjectClass("person"); MAObjectHologram originalObject = ActiveConfig.DB.GetMAObject(originalId, objectClass); originalObject.SetObjectModificationType(ObjectModificationType.Update, false); originalObject.SetAttributeValue(ActiveConfig.DB.GetAttribute("sapPersonId"), 7777L); originalObject.SetAttributeValue(ActiveConfig.DB.GetAttribute("accountName"), "jesus"); originalObject.DeletedTimestamp = DateTime.UtcNow.Ticks; originalObject.CommitCSEntryChange(); csentry = CSEntryChange.Create(); csentry.DN = replacementId.ToString(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.ObjectType = "person"; csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mail", "*****@*****.**")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("sapPersonId", 7777L)); CSEntryExport.PutExportEntry(csentry, out refretry); MAObjectHologram newObject = ActiveConfig.DB.GetMAObjectOrDefault(replacementId); if (newObject == null) { Assert.Fail("The object with the new ID was not found"); } if (newObject.GetSVAttributeValue(ActiveConfig.DB.GetAttribute("accountName")) != "jesus") { Assert.Fail("The object was not resurrected"); } if (newObject.DeletedTimestamp != 0) { Assert.Fail("The object was not undeleted"); } originalObject = ActiveConfig.DB.GetMAObjectOrDefault(originalId); if (originalObject != null) { Assert.Fail("The original object still exists"); } } finally { ActiveConfig.DB.DeleteMAObjectPermanent(originalId); ActiveConfig.DB.DeleteMAObjectPermanent(replacementId); } }
protected override void ProcessRecord() { Global.ThrowIfNotConnected(this); try { MAStatistics.StartOperation(MAOperationType.Export); ActiveConfig.DB.CanCache = true; Console.WriteLine("Reading import file... "); StreamReader r = new StreamReader(this.FileName); XmlReader reader = XmlReader.Create(r); var doc = XDocument.Load(reader); Console.WriteLine("Importing objects... "); this.totalObjectCount = doc.Root.Elements().Count(); ProgressRecord progress = new ProgressRecord(0, "Import", "Starting import"); this.operationStartTime = DateTime.Now; this.sampleIntervalStartTime = DateTime.Now; this.timer = new Timer(1000); this.timer.Elapsed += this.timer_Elapsed; this.timer.Start(); progress.RecordType = ProgressRecordType.Processing; progress.PercentComplete = 0; this.WriteProgress(progress); foreach (var node in doc.Root.Elements("object-change")) { bool refretry; //XElement element = node; AcmaCSEntryChange csentry = CSEntryChangeXmlImport.ImportFromXml(node, !this.IgnoreMissingAttributes.IsPresent); progress.PercentComplete = Convert.ToInt32(((decimal)this.currentObjectCount / this.totalObjectCount) * 100); progress.StatusDescription = string.Format("Importing {0}/{1}... {2} ({3} objects/sec)", this.currentObjectCount, this.totalObjectCount, csentry.DN, this.sampleOpsSec); progress.CurrentOperation = string.Format("Average rate: {0} objects/sec", this.averageOpsSec); progress.SecondsRemaining = this.secondsRemaining; this.WriteProgress(progress); try { CSEntryExport.PutExportEntry(csentry, out refretry); } catch (Exception ex) { Console.WriteLine("Error importing object {0}: {1}: {2}", this.currentObjectCount, csentry.DN, ex.Message); } this.currentObjectCount++; } progress.RecordType = ProgressRecordType.Completed; WriteProgress(progress); Console.WriteLine("Done"); MAStatistics.StopOperation(); Console.WriteLine(MAStatistics.ToString()); } catch (Exception ex) { Logger.WriteException(ex); ErrorRecord error = new ErrorRecord(ex, "UnknownError", ErrorCategory.NotSpecified, this.FileName); ThrowTerminatingError(error); } finally { if (this.timer != null) { this.timer.Stop(); this.timer.Elapsed -= this.timer_Elapsed; } } }
public void ImportCSEntryChangeTest() { List <AcmaSchemaAttribute> attributes = new List <AcmaSchemaAttribute>(); attributes.Add(ActiveConfig.DB.GetAttribute("mail")); attributes.Add(ActiveConfig.DB.GetAttribute("unixUid")); attributes.Add(ActiveConfig.DB.GetAttribute("supervisor")); attributes.Add(ActiveConfig.DB.GetAttribute("connectedToSap")); attributes.Add(ActiveConfig.DB.GetAttribute("objectSid")); attributes.Add(ActiveConfig.DB.GetAttribute("mailAlternateAddresses")); attributes.Add(ActiveConfig.DB.GetAttribute("expiryDates")); attributes.Add(ActiveConfig.DB.GetAttribute("directReports")); attributes.Add(ActiveConfig.DB.GetAttribute("objectSids")); attributes.Add(ActiveConfig.DB.GetAttribute("dateTimeSV")); attributes.Add(ActiveConfig.DB.GetAttribute("dateTimeMV")); Guid id = Guid.NewGuid(); CSEntryChange csentry = CSEntryChange.Create(); csentry.DN = id.ToString(); csentry.ObjectModificationType = ObjectModificationType.Add; csentry.ObjectType = "person"; csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mail", "*****@*****.**")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mailAlternateAddresses", new List <object> { "*****@*****.**", "*****@*****.**" })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("unixUid", 44L)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("expiryDates", new List <object>() { 55L, 66L, 77L })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("directReports", new List <object>() { new Guid("{8FC92471-7835-4804-8BBB-0A5ED7078074}"), new Guid("{0EF7CC21-729E-4ED9-A3AF-8203796334C6}") })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("supervisor", new Guid("{2807ED76-E262-4EB4-ABD9-9629F3830F12}"))); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("connectedToSap", true)); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSids", new List <object>() { new byte[] { 0, 1, 2, 3, 4, 5 }, new byte[] { 2, 4, 6, 8, 0 } })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("objectSid", new byte[] { 0, 1, 2, 3, 4 })); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("dateTimeSV", "2010-01-01")); csentry.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("dateTimeMV", "2011-01-01")); AcmaSchemaObjectClass objectClass = ActiveConfig.DB.GetObjectClass("person"); try { bool refretry; CSEntryExport.PutExportEntry(csentry, out refretry); MAObjectHologram sourceObject = ActiveConfig.DB.GetMAObject(id, objectClass); CSEntryChange generatedCSEntry = sourceObject.ToCSEntryChange( ); if (generatedCSEntry.ErrorCodeImport != MAImportError.Success) { Assert.Fail("The CSEntryChange generator failed to generate the object"); } AttributeValue value; value = new AttributeValue(ActiveConfig.DB.GetAttribute("mail"), generatedCSEntry.AttributeChanges["mail"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value); if (value != "*****@*****.**") { Assert.Fail("One or more attribute changes were not generated"); } value = new AttributeValue(ActiveConfig.DB.GetAttribute("unixUid"), generatedCSEntry.AttributeChanges["unixUid"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value); if (value != 44L) { Assert.Fail("One or more attribute changes were not generated"); } value = new AttributeValue(ActiveConfig.DB.GetAttribute("connectedToSap"), generatedCSEntry.AttributeChanges["connectedToSap"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value); if (value != true) { Assert.Fail("One or more attribute changes were not generated"); } value = new AttributeValue(ActiveConfig.DB.GetAttribute("objectSid"), generatedCSEntry.AttributeChanges["objectSid"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value); if (value != new byte[] { 0, 1, 2, 3, 4 }) { Assert.Fail("One or more attribute changes were not generated"); } value = new AttributeValue(ActiveConfig.DB.GetAttribute("supervisor"), generatedCSEntry.AttributeChanges["supervisor"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value); if (value != new Guid("{2807ED76-E262-4EB4-ABD9-9629F3830F12}")) { Assert.Fail("One or more attribute changes were not generated"); } string dateValue = generatedCSEntry.AttributeChanges["dateTimeSV"].ValueChanges.FirstOrDefault(t => t.ModificationType == ValueModificationType.Add).Value as string; if (dateValue != "2010-01-01T00:00:00.000") { Assert.Fail("One or more attribute changes were not generated"); } AttributeValues values = new InternalAttributeValues(ActiveConfig.DB.GetAttribute("mailAlternateAddresses"), generatedCSEntry.AttributeChanges["mailAlternateAddresses"].ValueChanges.Where(t => t.ModificationType == ValueModificationType.Add).Select(t => t.Value).ToList()); if (!values.ContainsAllElements(new List <object> { "*****@*****.**", "*****@*****.**" })) { Assert.Fail("One or more attribute changes were not generated"); } List <string> list = generatedCSEntry.AttributeChanges["dateTimeMV"].ValueChanges.Where(t => t.ModificationType == ValueModificationType.Add).Select(t => t.Value).Cast <string>().ToList(); if (!list.ContainsSameElements(new List <object> { "2011-01-01T00:00:00.000" })) { Assert.Fail("One or more attribute changes were not generated"); } values = new InternalAttributeValues(ActiveConfig.DB.GetAttribute("expiryDates"), generatedCSEntry.AttributeChanges["expiryDates"].ValueChanges.Where(t => t.ModificationType == ValueModificationType.Add).Select(t => t.Value).ToList()); if (!values.ContainsAllElements(new List <object>() { 55L, 66L, 77L })) { Assert.Fail("One or more attribute changes were not generated"); } values = new InternalAttributeValues(ActiveConfig.DB.GetAttribute("directReports"), generatedCSEntry.AttributeChanges["directReports"].ValueChanges.Where(t => t.ModificationType == ValueModificationType.Add).Select(t => t.Value).ToList()); if (!values.ContainsAllElements(new List <object>() { new Guid("{8FC92471-7835-4804-8BBB-0A5ED7078074}"), new Guid("{0EF7CC21-729E-4ED9-A3AF-8203796334C6}") })) { Assert.Fail("One or more attribute changes were not generated"); } values = new InternalAttributeValues(ActiveConfig.DB.GetAttribute("objectSids"), generatedCSEntry.AttributeChanges["objectSids"].ValueChanges.Where(t => t.ModificationType == ValueModificationType.Add).Select(t => t.Value).ToList()); if (!values.ContainsAllElements(new List <object>() { new byte[] { 0, 1, 2, 3, 4, 5 }, new byte[] { 2, 4, 6, 8, 0 } })) { Assert.Fail("One or more attribute changes were not generated"); } } finally { ActiveConfig.DB.DeleteMAObjectPermanent(id); } }