Example #1
0
        public async Task <ActionResult> CreateInstance([FromBody] CreateInstanceRequest request)
        {
            var resp = await(await factory.GetInstanceServiceClient())
                       .CreateInstanceAsync(new AcademyCloud.ResourceManagement.Protos.Instance.CreateInstanceRequest
            {
                Name       = request.Name,
                ImageName  = request.ImageName,
                FlavorName = request.FlavorName,
                Volume     = request.Volume
            });

            // add the resources usage to expenses
            await(await factory.GetExpensesInteropClientAsync())
            .ChangeProjectUserResourcesAsync(new AcademyCloud.Expenses.Protos.Interop.ChangeProjectUserResourcesRequest
            {
                ResourcesDelta = new AcademyCloud.Expenses.Protos.Common.Resources
                {
                    Cpu     = resp.Flavor.Cpu,
                    Memory  = resp.Flavor.Memory,
                    Storage = request.Volume,
                }
            });

            return(Created(resp.InstanceId, resp.InstanceId));
        }
        public async Task <ActionResult <GetDomainsResponse> > GetDomains()
        {
            var resp = await(await factory.GetDomainsClientAsync())
                       .GetDomainsAsync(new AcademyCloud.Identity.Protos.Domains.GetDomainsRequest
            {
            });

            var subjects = resp.Domains.Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject
            {
                Id   = x.Id,
                Type = AcademyCloud.Expenses.Protos.Common.SubjectType.Domain,
            });

            // get pay users
            var payUsers = await(await factory.GetExpensesInteropClientAsync())
                           .GetPayUserAsync(new AcademyCloud.Expenses.Protos.Interop.GetPayUserRequest
            {
                Subjects = { subjects }
            });

            // get pay user's names
            var payUserNames = await(await factory.GetIdentityInteropClientAsync())
                               .GetNamesAsync(new AcademyCloud.Identity.Protos.Interop.GetNamesRequest
            {
                Subjects =
                {
                    payUsers.PayUsers.Values.Select(x => new AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.Subject
                    {
                        Id   = x,
                        Type = AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.SubjectType.User,
                    })
                }
            });

            // get resources
            var quotas = await(await factory.GetExpensesInteropClientAsync())
                         .GetQuotaAsync(new AcademyCloud.Expenses.Protos.Interop.GetQuotaRequest
            {
                Subjects = { subjects }
            });

            return(new GetDomainsResponse
            {
                Domains = resp.Domains.Select(x => new Domain
                {
                    Id = x.Id,
                    Name = x.Name,
                    Active = true,
                    Admins = x.Admins.Select(FromGrpc),
                    PayUser = new User {
                        Id = payUsers.PayUsers[x.Id], Name = payUserNames.IdNameMap[payUsers.PayUsers[x.Id]]
                    },
                    Quota = quotas.Quotas[x.Id],
                })
            });
        }
Example #3
0
        private async Task <(bool, bool)> GetUserAndScopeActivity(string userId, Scope scope)
        {
            (AcademyCloud.Expenses.Protos.Common.SubjectType, string)subject;
            if (scope.System)
            {
                subject = (AcademyCloud.Expenses.Protos.Common.SubjectType.System, "");
            }
            else if (string.IsNullOrEmpty(scope.ProjectId))
            {
                subject = (AcademyCloud.Expenses.Protos.Common.SubjectType.Domain, scope.DomainId);
            }
            else
            {
                subject = (AcademyCloud.Expenses.Protos.Common.SubjectType.Project, scope.ProjectId);
            }

            // get activity
            var activityResp = await(await factory.GetExpensesInteropClientAsync())
                               .GetActivityAsync(new AcademyCloud.Expenses.Protos.Interop.GetActivityRequest
            {
                Subjects =
                {
                    new AcademyCloud.Expenses.Protos.Interop.Subject {
                        Type = AcademyCloud.Expenses.Protos.Common.SubjectType.User, Id = userId
                    },
                    new AcademyCloud.Expenses.Protos.Interop.Subject
                    {
                        Type = subject.Item1,
                        Id   = subject.Item2,
                    }
                }
            });

            return(activityResp.Activities[userId], activityResp.Activities[subject.Item2]);
        }
Example #4
0
        public async Task <ActionResult <GetAllUsersResponse> > GetAllUsers()
        {
            var resp = await(await factory.GetUsersClientAsync())
                       .GetAccessibleUsersAsync(new AcademyCloud.Identity.Protos.Users.GetAccessibleUsersRequest {
            });

            // request to expenses to get user activity

            // Pick ids and types
            var subjects = resp.Users.Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject
            {
                Id   = x.Id,
                Type = AcademyCloud.Expenses.Protos.Common.SubjectType.User,
            });

            // send the request
            var activitiesResp = await(await factory.GetExpensesInteropClientAsync())
                                 .GetActivityAsync(new AcademyCloud.Expenses.Protos.Interop.GetActivityRequest
            {
                Subjects = { subjects }
            });

            // merge back activities
            var fullUsers = resp.Users.Select(x => new UserForSystem
            {
                Id     = x.Id,
                Active = activitiesResp.Activities[x.Id],
                Name   = x.Name,
            });

            return(new GetAllUsersResponse
            {
                Users = fullUsers,
            });
        }
Example #5
0
        public async Task <GetQuotaStatusResponse> GetQuotaStatus([FromRoute] SubjectType subjectType, [FromRoute] string id = "")
        {
            var resp = await(await factory.GetExpensesInteropClientAsync())
                       .GetQuotaStatusAsync(new AcademyCloud.Expenses.Protos.Interop.GetQuotaStatusRequest
            {
                Subject = new AcademyCloud.Expenses.Protos.Interop.Subject
                {
                    Id   = id,
                    Type = subjectType
                }
            });

            return(new GetQuotaStatusResponse
            {
                Total = resp.Total,
                Used = resp.Used,
            });
        }
        public async Task <GetResourcesLimitResponse> GetLimit()
        {
            var resp = await(await factory.GetExpensesInteropClientAsync())
                       .GetQuotaStatusOfCurrentProjectUserAsync(new AcademyCloud.Expenses.Protos.Interop.GetQuotaStatusOfCurrentProjectUserRequest {
            });

            return(new GetResourcesLimitResponse
            {
                Used = resp.Used,
                Allocated = resp.Total,
            });
        }
        public async Task <GetAccessibleProjectsResponse> GetAccessibleProjects()
        {
            var resp = await(await factory.GetProjectsClientAsync())
                       .GetAccessibleProjectsAsync(new AcademyCloud.Identity.Protos.Projects.GetAccessibleProjectsRequest
            {
            });

            var subjects = resp.Projects
                           .Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject
            {
                Id   = x.Id,
                Type = AcademyCloud.Expenses.Protos.Common.SubjectType.Project,
            });


            // get pay users
            var payUsers = await(await factory.GetExpensesInteropClientAsync())
                           .GetPayUserAsync(new AcademyCloud.Expenses.Protos.Interop.GetPayUserRequest
            {
                Subjects = { subjects }
            });

            // get pay user's names
            var payUserNames = await(await factory.GetIdentityInteropClientAsync())
                               .GetNamesAsync(new AcademyCloud.Identity.Protos.Interop.GetNamesRequest
            {
                Subjects =
                {
                    payUsers.PayUsers.Values.Select(x => new AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.Subject
                    {
                        Id   = x,
                        Type = AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.SubjectType.User,
                    })
                }
            });

            var quotaSubjects = subjects
                                .Concat(
                resp.Projects
                .Select(x => x.Admins)
                .Concat(resp.Projects.Select(x => x.Members))
                .SelectMany(x => x)
                .Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject
            {
                Id   = x.UserProjectAssignmentId.ToString(),
                Type = AcademyCloud.Expenses.Protos.Common.SubjectType.UserProjectAssignment
            }
                        ));

            // get quotas
            var quotas = await(await factory.GetExpensesInteropClientAsync())
                         .GetQuotaAsync(new AcademyCloud.Expenses.Protos.Interop.GetQuotaRequest
            {
                Subjects = { quotaSubjects }
            });


            return(new GetAccessibleProjectsResponse()
            {
                Projects = resp.Projects.Select(x => new Project()
                {
                    Id = x.Id,
                    Name = x.Name,
                    Active = true,
                    Admins = x.Admins.Select(x => FromGrpc(x.User)),
                    Members = x.Members.Select(x => FromGrpc(x.User)),
                    PayUser = new Models.Identity.Common.User
                    {
                        Id = payUsers.PayUsers[x.Id],
                        Name = payUserNames.IdNameMap[payUsers.PayUsers[x.Id]],
                    },
                    Quota = quotas.Quotas[x.Id],
                    UserQuotas = x.Admins.Concat(x.Members).ToDictionary(user => user.User.Id, user => (Resources)quotas.Quotas[user.UserProjectAssignmentId])
                })
            });
        }