示例#1
0
        public async Task <InvokeResult> DeleteInstanceAsync(String instanceId, EntityHeader org, EntityHeader user)
        {
            var instance = await _instanceRepo.GetInstanceAsync(instanceId);

            await AuthorizeAsync(instance, AuthorizeResult.AuthorizeActions.Delete, user, org);
            await CheckForDepenenciesAsync(instance);

            var repo = await _deviceManagerRepo.GetDeviceRepositoryAsync(instance.DeviceRepository.Id, org, user);

            if (repo != null)
            {
                /* Upon deletion release the repo so it can be used somewhere else */
                repo.Instance = null;
                await _deviceManagerRepo.UpdateDeviceRepositoryAsync(repo, org, user);
            }

            instance.IsArchived = true;
            await _instanceRepo.UpdateInstanceAsync(instance);

            if (!EntityHeader.IsNullOrEmpty(instance.PrimaryHost))
            {
                var host = await _deploymentHostManager.GetDeploymentHostAsync(instance.PrimaryHost.Id, org, user);

                if (host.HostType.Value == HostTypes.Dedicated)
                {
                    await PerformActionAsync(instance, org, user, DeploymentActivityTaskTypes.DestroyHost);

                    await _deploymentHostManager.DeleteDeploymentHostAsync(host.Id, org, user);
                }
            }

            return(InvokeResult.Success);
        }
        public async Task <InvokeResult> UpdateInstanceAsync(DeploymentInstance instance, EntityHeader org, EntityHeader user)
        {
            ValidationCheck(instance, Actions.Update);
            await AuthorizeAsync(instance, AuthorizeResult.AuthorizeActions.Update, user, org);

            var existingInstance = await _instanceRepo.GetInstanceAsync(instance.Id);

            if (existingInstance.DeviceRepository.Id != instance.DeviceRepository.Id)
            {
                var newlyAssginedRepo = await _deviceManagerRepo.GetDeviceRepositoryAsync(instance.DeviceRepository.Id, org, user);

                if (!EntityHeader.IsNullOrEmpty(newlyAssginedRepo.Instance))
                {
                    throw new ValidationException("Device Repository In Use", new ErrorMessage($"Repository is already assigned to the instance {newlyAssginedRepo.Instance.Text}.  A Device Repository can only be assigned to one Instance at a time."));
                }

                newlyAssginedRepo.Instance = EntityHeader.Create(instance.Id, instance.Name);
                await _deviceManagerRepo.UpdateDeviceRepositoryAsync(newlyAssginedRepo, org, user);

                var oldRepo = await _deviceManagerRepo.GetDeviceRepositoryAsync(existingInstance.DeviceRepository.Id, org, user);

                oldRepo.Instance = null;
                await _deviceManagerRepo.UpdateDeviceRepositoryAsync(oldRepo, org, user);
            }

            if (existingInstance.Status.Value != instance.Status.Value ||
                existingInstance.IsDeployed != instance.IsDeployed)
            {
                await UpdateInstanceStatusAsync(instance.Id, instance.Status.Value, instance.IsDeployed, instance.ContainerTag.Text.Replace("v", string.Empty), org, user);
            }

            var solution = instance.Solution.Value;

            instance.Solution.Value = null;
            await _instanceRepo.UpdateInstanceAsync(instance);

            instance.Solution.Value = solution;

            if (!EntityHeader.IsNullOrEmpty(instance.PrimaryHost))
            {
                var host = await _deploymentHostManager.GetDeploymentHostAsync(instance.PrimaryHost.Id, org, user);

                if (host.Size.Id != instance.Size.Id ||
                    host.CloudProvider.Id != instance.CloudProvider.Id ||
                    host.Subscription.Id != instance.Subscription.Id ||
                    host.ContainerRepository.Id != instance.ContainerRepository.Id ||
                    host.ContainerTag.Id != instance.ContainerTag.Id)
                {
                    host.Size                = instance.Size;
                    host.Subscription        = instance.Subscription;
                    host.CloudProvider       = instance.CloudProvider;
                    host.ContainerRepository = instance.ContainerRepository;
                    host.ContainerTag        = instance.ContainerTag;
                    await _deploymentHostManager.UpdateDeploymentHostAsync(host, org, user);
                }
            }

            return(InvokeResult.Success);
        }
        public async Task <DeploymentInstance> GetInstanceAsync(string instanceId, EntityHeader org, EntityHeader user)
        {
            var instance = await _instanceRepo.GetInstanceAsync(instanceId);

            MapInstanceProperties(instance);

            await AuthorizeAsync(instance, AuthorizeResult.AuthorizeActions.Read, user, org);

            var keysUpdated = false;

            if (String.IsNullOrEmpty(instance.SharedAccessKeySecureId1))
            {
                keysUpdated = true;
                var key          = GenerateRandomKey();
                var keyAddResult = await _secureStorage.AddSecretAsync(org, key);

                if (!keyAddResult.Successful)
                {
                    return(null);
                }
                instance.SharedAccessKeySecureId1 = keyAddResult.Result;
            }

            if (String.IsNullOrEmpty(instance.SharedAccessKeySecureId2))
            {
                keysUpdated = true;
                var key          = GenerateRandomKey();
                var keyAddResult = await _secureStorage.AddSecretAsync(org, key);

                if (!keyAddResult.Successful)
                {
                    return(null);
                }
                instance.SharedAccessKeySecureId2 = keyAddResult.Result;
            }

            if (keysUpdated)
            {
                await AuthorizeAsync(instance, AuthorizeResult.AuthorizeActions.Update, user, org, "Added Missing Keys");

                await _instanceRepo.UpdateInstanceAsync(instance);
            }

            return(instance);
        }