private Instance(Instance other) { this.Key = other.Key; this.GroupKey = other.GroupKey; this.TargetKey = other.TargetKey; this.Name = other.Name; this.Tags = other.Tags; }
public void CreateInstance(Instance instance) { if (instance == null) throw new ArgumentNullException("instance", "Instance cannot be null."); if (instance.TargetKey == Guid.Empty) throw new ArgumentException("Target key cannot be empty.", "instance.TargetKey"); using (var stream = instance.Serialise()) { try { using (var client = new AmazonS3Client(Context.AwsAccessKeyId, Context.AwsSecretAccessKey)) { var targetsController = new Targets(Context); if (!targetsController.TargetExists(instance.TargetKey)) throw new TargetNotFoundException(String.Format("Target with the key \"{0}\" could not be found.", instance.TargetKey)); var indexesController = new Internal.Indexes(Context); string indexPath = GetTargetInstancesIndexPath(instance.TargetKey); var instanceIndex = indexesController.LoadIndex(indexPath); if (instanceIndex.Entries.Any(e => e.Key == instance.Key)) { throw new DeploymentException("Target instances index already contains entry for new instance key!"); } using (var putResponse = client.PutObject(new PutObjectRequest() { BucketName = Context.BucketName, Key = string.Format("{0}/{1}/{2}", STR_INSTANCES_CONTAINER_PATH, instance.Key.ToString("N"), STR_INFO_FILE_NAME), InputStream = stream, })) { } instanceIndex.Entries.Add(new Internal.EntityIndexEntry() { Key = instance.Key, Name = instance.Name }); Internal.Indexes.NameSortIndex(instanceIndex); indexesController.UpdateIndex(indexPath, instanceIndex); } } catch (AmazonS3Exception awsEx) { throw new DeploymentException("Failed creating instance.", awsEx); } } }
public void UpdateInstance(Instance updatedInstance) { if (updatedInstance == null) throw new ArgumentNullException("updatedInstance", "Instance cannot be null."); var existingInstance = GetInstance(updatedInstance.Key); // Don't allow moving between targets. updatedInstance.TargetKey = existingInstance.TargetKey; using (var stream = updatedInstance.Serialise()) { try { using (var client = new AmazonS3Client(Context.AwsAccessKeyId, Context.AwsSecretAccessKey)) { using (var putResponse = client.PutObject(new PutObjectRequest() { BucketName = Context.BucketName, Key = string.Format("{0}/{1}/{2}", STR_INSTANCES_CONTAINER_PATH, updatedInstance.Key.ToString("N"), STR_INFO_FILE_NAME), InputStream = stream, })) { } var indexesController = new Internal.Indexes(Context); string indexPath = GetTargetInstancesIndexPath(updatedInstance.TargetKey); indexesController.PutIndexEntry(indexPath, new Internal.EntityIndexEntry() { Key = updatedInstance.Key, Name = updatedInstance.Name }); } } catch (AmazonS3Exception awsEx) { throw new DeploymentException("Failed updating instance.", awsEx); } } }
public static Stream Serialise(Instance instance) { if (instance == null) throw new ArgumentNullException("version", "Version cannot be null."); if (!Validation.IsNameValid(instance.Name)) throw new ArgumentException("Name must be valid (not blank & only a single line)."); var doc = new XDocument( new XDeclaration("1.0", "UTF-8", "yes"), new XElement("instance", new XAttribute("key", instance.Key), new XElement("groupKey", instance.GroupKey), new XElement("targetKey", instance.TargetKey), new XElement("name", instance.Name), new XElement("tags"))); if (instance.Tags != null && instance.Tags.Count > 0) { doc.Root.Element("tags").Add( instance.Tags.Select(t => new XElement("tag", new XAttribute("key", t.Key), t.Value ))); } return Serialisation.Serialise(doc); }
public static Instance Parse(XmlReader source) { XDocument doc; try { doc = XDocument.Load(source); } catch (Exception ex) { throw new DeserialisationException("Failed deserialising instance.", ex); } if (!ValidateInstanceXml(doc)) throw new DeserialisationException("Serialised instance xml is not valid."); Guid key, groupKey, targetKey; if (!Guid.TryParse(doc.Root.Attribute("key").Value, out key)) throw new DeserialisationException("Serialised instance key is not a valid guid."); if (!Guid.TryParse(doc.Root.Element("groupKey").Value, out groupKey)) throw new DeserialisationException("Serialised instance group key is not a valid guid."); if (!Guid.TryParse(doc.Root.Element("targetKey").Value, out targetKey)) throw new DeserialisationException("Serialised instance target key is not a valid guid."); var instance = new Instance() { Key = key, GroupKey = groupKey, TargetKey = targetKey, Name = doc.Root.Element("name").Value, }; var tagsElement = doc.Root.Element("tags"); if (tagsElement != null && tagsElement.HasElements) { instance.Tags = tagsElement.Elements("tag").ToDictionary(t => t.Attribute("key").Value, t => t.Value); } else { instance.Tags = new Dictionary<string, string>(); } return instance; }