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); } } }