shared/lib/services/ProjectService.dart (70 lines of code) (raw):

// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import 'dart:io'; import 'package:cloud_provision_shared/services/models/project.dart'; import 'package:googleapis/cloudresourcemanager/v1.dart' as crm; import 'package:googleapis/serviceusage/v1.dart' as su; import 'package:googleapis/artifactregistry/v1.dart' as ar; import 'BaseService.dart'; class ProjectService extends BaseService { ProjectService(String accessToken) : super(accessToken); String wsUrl = "cloudresourcemanager.googleapis.com"; Future<List<Project>> getProjects() async { List<Project> projectsList = []; crm.CloudResourceManagerApi cloudResourceManagerApi = new crm.CloudResourceManagerApi(getAuthenticatedClient()); crm.ListProjectsResponse list = await cloudResourceManagerApi.projects.list(filter: 'lifecycleState:ACTIVE'); list.projects!.forEach((project) { projectsList.add(Project.fromJson(project.toJson())); }); // String endpointPath = '/v1/projects'; // final queryParameters = { // 'filter': 'lifecycleState:ACTIVE', // }; // Uri url = Uri.https(wsUrl, endpointPath, queryParameters); // Option 1 - http client // Response res = await http.get(url, headers: getRequestHeaders()); // Option 2 - AuthClient // Response res = await authClient.get(url); // Map<String, dynamic> projects = jsonDecode(res.body); // for (Map<String, dynamic> project in projects['projects']) { // projectsList.add(Project.fromJson(project)); // } return projectsList; } enableService(String projectId, String serviceName) async { if (projectId == "null") return; String service = 'projects/${projectId}/services/${serviceName}'; su.ServiceUsageApi serviceUsageApi = new su.ServiceUsageApi(getAuthenticatedClient()); su.GoogleApiServiceusageV1Service res = await serviceUsageApi.services.get(service); if (res.state == "DISABLED") { su.EnableServiceRequest request = new su.EnableServiceRequest(); su.Operation enableRequest = await serviceUsageApi.services.enable(request, service); }/* else { su.DisableServiceRequest request = new su.DisableServiceRequest(); su.Operation disableRequest = await serviceUsageApi.services.disable(request, service); }*/ } isServiceEnabled(String projectId, String serviceName) async { if (projectId == "null") return; String service = 'projects/${projectId}/services/${serviceName}'; su.ServiceUsageApi serviceUsageApi = new su.ServiceUsageApi(getAuthenticatedClient()); su.GoogleApiServiceusageV1Service res = await serviceUsageApi.services.get(service); return res.state == "ENABLED"; } grantRoles(String projectId, String projectNumber) async { if (projectId == "null") return; crm.CloudResourceManagerApi cloudResourceManagerApi = new crm.CloudResourceManagerApi(getAuthenticatedClient()); crm.GetIamPolicyRequest request = new crm.GetIamPolicyRequest(); crm.Policy projectPolicy = await cloudResourceManagerApi.projects.getIamPolicy(request, projectId); String saCloudBuild = "serviceAccount:${projectNumber}@cloudbuild.gserviceaccount.com"; projectPolicy.bindings?.add(createNewBinding(saCloudBuild, "roles/run.admin")); projectPolicy.bindings?.add(createNewBinding(saCloudBuild, "roles/secretmanager.admin")); projectPolicy.bindings?.add(createNewBinding(saCloudBuild, "roles/iam.serviceAccountUser")); projectPolicy.bindings?.add(createNewBinding(saCloudBuild, "roles/workstations.admin")); projectPolicy.bindings?.add(createNewBinding("serviceAccount:${projectNumber}-compute@developer.gserviceaccount.com", "roles/editor")); projectPolicy.bindings?.add(createNewBinding("serviceAccount:service-${projectNumber}@gcp-sa-cloudbuild.iam.gserviceaccount.com", "roles/secretmanager.admin")); // Granting access to Cloud Build service account from Cloud Workbench project // String saCloudBuildCW = "serviceAccount:NNNNNNNNNNN@cloudbuild.gserviceaccount.com"; // // projectPolicy.bindings?.add(createNewBinding(saCloudBuildCW, "roles/run.developer")); // projectPolicy.bindings?.add(createNewBinding(saCloudBuildCW, "roles/secretmanager.admin")); // projectPolicy.bindings?.add(createNewBinding(saCloudBuildCW, "roles/iam.serviceAccountUser")); crm.SetIamPolicyRequest setRequest = new crm.SetIamPolicyRequest(); setRequest.policy = projectPolicy; crm.Policy updatedProjectPolicy = await cloudResourceManagerApi.projects.setIamPolicy(setRequest, projectId); } createNewBinding(String member, String role) { crm.Binding newBinding = new crm.Binding(); newBinding.members = [member]; newBinding.role = role; return newBinding; } createArtifactRegistry(String projectId, String region, String name, String format) async { String parent = 'projects/${projectId}/locations/${region}'; ar.ArtifactRegistryApi artifactRegistryApi = new ar.ArtifactRegistryApi(getAuthenticatedClient()); ar.Repository request = new ar.Repository(); request.name = name; request.format = format; ar.Operation operation = await artifactRegistryApi.projects.locations.repositories.create(request, parent, repositoryId: name); } }