return fullProject; Project project = new Project(); for (String field : fields) { switch (field) { case "createTime": project.setCreateTime(fullProject.getCreateTime()); break; case "labels": project.setLabels(fullProject.getLabels()); break; case "lifecycleState": project.setLifecycleState(fullProject.getLifecycleState()); break; case "name": project.setName(fullProject.getName()); break; case "parent": project.setParent(fullProject.getParent()); break; case "projectId": project.setProjectId(fullProject.getProjectId()); break; case "projectNumber": project.setProjectNumber(fullProject.getProjectNumber()); break;
com.google.api.services.cloudresourcemanager.model.Project toPb() { com.google.api.services.cloudresourcemanager.model.Project projectPb = new com.google.api.services.cloudresourcemanager.model.Project(); projectPb.setName(name); projectPb.setProjectId(projectId); projectPb.setLabels(labels); projectPb.setProjectNumber(projectNumber); if (state != null) { projectPb.setLifecycleState(state.toString()); } if (createTimeMillis != null) { projectPb.setCreateTime( DateTimeFormatter.ISO_DATE_TIME .withZone(ZoneOffset.UTC) .format(Instant.ofEpochMilli(createTimeMillis))); } if (parent != null) { projectPb.setParent(parent.toPb()); } return projectPb; }
private static String checkForProjectErrors(Project project) { if (project.getProjectId() == null) { return "Project ID cannot be empty."; if (!isValidIdOrLabel(project.getProjectId(), 6, 30)) { return "Project " + project.getProjectId() + " has an invalid ID." + " See https://cloud.google.com/resource-manager/reference/rest/" if (project.getName() != null) { for (char c : project.getName().toCharArray()) { if (!PERMISSIBLE_PROJECT_NAME_PUNCTUATION.contains(c) && !Character.isLetterOrDigit(c)) { return "Project " + project.getProjectId() + " has an invalid name." + " See https://cloud.google.com/resource-manager/reference/rest/" if (project.getLabels() != null) { if (project.getLabels().size() > 256) { return "Project " + project.getProjectId() + " exceeds the limit of 256 labels."; for (Map.Entry<String, String> entry : project.getLabels().entrySet()) { if (!isValidIdOrLabel(entry.getKey(), 1, 63) || !isValidIdOrLabel(entry.getValue(), 0, 63)) { return "Project " + project.getProjectId() + " has an invalid label entry." + " See https://cloud.google.com/resource-manager/reference/rest/"
static ProjectInfo fromPb(com.google.api.services.cloudresourcemanager.model.Project projectPb) { Builder builder = newBuilder(projectPb.getProjectId()).setProjectNumber(projectPb.getProjectNumber()); if (projectPb.getName() != null && !projectPb.getName().equals("Unnamed")) { builder.setName(projectPb.getName()); } if (projectPb.getLabels() != null) { builder.setLabels(projectPb.getLabels()); } if (projectPb.getLifecycleState() != null) { builder.setState(State.valueOf(projectPb.getLifecycleState())); } if (projectPb.getCreateTime() != null) { builder.setCreateTimeMillis( DATE_TIME_FORMATTER.parse(projectPb.getCreateTime(), Instant.FROM).toEpochMilli()); } if (projectPb.getParent() != null) { builder.setParent(ResourceId.fromPb(projectPb.getParent())); } return builder.build(); } }
Map<String, String> newLabels = ImmutableMap.of("new k1", "new v1"); com.google.api.services.cloudresourcemanager.model.Project anotherCompleteProject = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId(COMPLETE_PROJECT.getProjectId()) .setName(newName) .setLabels(newLabels) .setProjectNumber(987654321L) .setCreateTime("2000-01-01T00:00:00.001Z") .setLifecycleState("DELETE_REQUESTED"); com.google.api.services.cloudresourcemanager.model.Project returnedProject = rpc.replace(anotherCompleteProject); compareReadWriteFields(anotherCompleteProject, returnedProject); assertEquals(createdProject.getProjectNumber(), returnedProject.getProjectNumber()); assertEquals(createdProject.getCreateTime(), returnedProject.getCreateTime()); assertEquals(createdProject.getLifecycleState(), returnedProject.getLifecycleState()); com.google.api.services.cloudresourcemanager.model.Project nonexistantProject = new com.google.api.services.cloudresourcemanager.model.Project(); nonexistantProject.setProjectId("some-project-id-that-does-not-exist"); try { rpc.replace(nonexistantProject);
synchronized Response replace(String projectId, Project project) { Project originalProject = projects.get(projectId); if (originalProject == null) { return Error.PERMISSION_DENIED.response( "Error when replacing " + projectId + " because the project was not found."); } else if (!originalProject.getLifecycleState().equals("ACTIVE")) { return Error.FAILED_PRECONDITION.response( "Error when replacing " + projectId + " because the lifecycle state was not ACTIVE."); } else if (!Objects.equal(originalProject.getParent(), project.getParent())) { return Error.INVALID_ARGUMENT.response( "The server currently only supports setting the parent once " + "and does not allow unsetting it."); } project.setProjectId(projectId); project.setLifecycleState(originalProject.getLifecycleState()); project.setCreateTime(originalProject.getCreateTime()); project.setProjectNumber(originalProject.getProjectNumber()); // replace cannot fail because both this method and removeProject are synchronized projects.replace(projectId, project); try { return new Response(HTTP_OK, jsonFactory.toString(project)); } catch (IOException e) { return Error.INTERNAL_ERROR.response("Error when serializing project " + projectId); } }
@Test public void testIsInvalidProjectName() { com.google.api.services.cloudresourcemanager.model.Project project = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("some-project-id"); rpc.create(project); assertNull(rpc.get(project.getProjectId(), EMPTY_RPC_OPTIONS).getName()); RESOURCE_MANAGER_HELPER.removeProject(project.getProjectId()); project.setName("This is a valid name-'\"!"); rpc.create(project); assertEquals(project.getName(), rpc.get(project.getProjectId(), EMPTY_RPC_OPTIONS).getName()); RESOURCE_MANAGER_HELPER.removeProject(project.getProjectId()); project.setName("invalid-character-,"); try { rpc.create(project); fail("Should fail because of invalid project name."); } catch (ResourceManagerException e) { assertEquals(400, e.getCode()); assertTrue(e.getMessage().contains("invalid name")); } }
nextPageToken = p.getProjectId(); break; } catch (IOException e) { return Error.INTERNAL_ERROR.response( "Error when serializing project " + p.getProjectId());
return Error.INVALID_ARGUMENT.response(customErrorMessage); } else { project.setLifecycleState("ACTIVE"); project.setProjectNumber(Math.abs(PROJECT_NUMBER_GENERATOR.nextLong() % Long.MAX_VALUE)); project.setCreateTime( DateTimeFormatter.ISO_DATE_TIME .withZone(ZoneOffset.UTC) .format(Instant.ofEpochMilli(System.currentTimeMillis()))); if (projects.putIfAbsent(project.getProjectId(), project) != null) { return Error.ALREADY_EXISTS.response( "A project with the same project ID (" + project.getProjectId() + ") already exists."); .setEtag(UUID.randomUUID().toString()) .setVersion(0); policies.put(project.getProjectId(), emptyPolicy); try { new Operation().setDone(false).setName("operations/" + project.getProjectId())); return new Response(HTTP_OK, createdProjectStr); } catch (IOException e) { return Error.INTERNAL_ERROR.response("Error serializing project " + project.getProjectId());
@Test public void testIsInvalidProjectId() { com.google.api.services.cloudresourcemanager.model.Project project = new com.google.api.services.cloudresourcemanager.model.Project(); String invalidIDMessageSubstring = "invalid ID"; expectInvalidArgumentException(project, "Project ID cannot be empty."); project.setProjectId("abcde"); expectInvalidArgumentException(project, invalidIDMessageSubstring); project.setProjectId("this-project-id-is-more-than-thirty-characters-long"); expectInvalidArgumentException(project, invalidIDMessageSubstring); project.setProjectId("project-id-with-invalid-character-?"); expectInvalidArgumentException(project, invalidIDMessageSubstring); project.setProjectId("-invalid-start-character"); expectInvalidArgumentException(project, invalidIDMessageSubstring); project.setProjectId("invalid-ending-character-"); expectInvalidArgumentException(project, invalidIDMessageSubstring); project.setProjectId("some-valid-project-id-12345"); rpc.create(project); assertNotNull(rpc.get(project.getProjectId(), EMPTY_RPC_OPTIONS)); }
@Before public void setUp() { model = new ProjectListTableModel(); testProject1 = new Project(); testProject1.setName("test-project"); testProject1.setProjectId("test-project-ID"); testProject2 = new Project(); testProject2.setName("test-project-2"); testProject2.setProjectId("test-project-2-ID"); }
@Test public void testIsInvalidProjectLabels() { com.google.api.services.cloudresourcemanager.model.Project project = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("some-valid-project-id"); String invalidLabelMessageSubstring = "invalid label entry"; project.setLabels(ImmutableMap.of("", "v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels( ImmutableMap.of( "this-project-label-is-more-than-sixty-three-characters-long-so-it-should-fail", "v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels( ImmutableMap.of( "k1", "this-project-label-is-more-than-sixty-three-characters-long-so-it-should-fail")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("k1?", "v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("k1", "v1*")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("-k1", "v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("k1", "-v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("k1-", "v1")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); project.setLabels(ImmutableMap.of("k1", "v1-")); expectInvalidArgumentException(project, invalidLabelMessageSubstring); Map<String, String> tooManyLabels = new HashMap<>();
private void compareReadWriteFields( com.google.api.services.cloudresourcemanager.model.Project expected, com.google.api.services.cloudresourcemanager.model.Project actual) { assertEquals(expected.getProjectId(), actual.getProjectId()); assertEquals(expected.getName(), actual.getName()); assertEquals(expected.getLabels(), actual.getLabels()); assertEquals(expected.getParent(), actual.getParent()); } }
@Test public void testReplaceAddingParent() { rpc.create(COMPLETE_PROJECT); com.google.api.services.cloudresourcemanager.model.Project anotherProject = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId(COMPLETE_PROJECT.getProjectId()) .setParent(PARENT); try { rpc.replace(anotherProject); fail("Should fail because the project's parent was modified after creation."); } catch (ResourceManagerException e) { assertEquals(400, e.getCode()); assertEquals( "The server currently only supports setting the parent once " + "and does not allow unsetting it.", e.getMessage()); } }
ResourceManagerRpc.Option.FILTER, "id:* name:myProject labels.color:blue LABELS.SIZE:*"); com.google.api.services.cloudresourcemanager.model.Project matchingProject = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("matching-project") .setName("MyProject") .setLabels(ImmutableMap.of("color", "blue", "size", "big")); com.google.api.services.cloudresourcemanager.model.Project nonMatchingProject1 = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("non-matching-project1") .setName("myProject"); nonMatchingProject1.setLabels(ImmutableMap.of("color", "blue")); com.google.api.services.cloudresourcemanager.model.Project nonMatchingProject2 = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("non-matching-project2") .setName("myProj") .setLabels(ImmutableMap.of("color", "blue", "size", "big")); com.google.api.services.cloudresourcemanager.model.Project nonMatchingProject3 = new com.google.api.services.cloudresourcemanager.model.Project() .setProjectId("non-matching-project3"); rpc.create(matchingProject); rpc.create(nonMatchingProject1); for (com.google.api.services.cloudresourcemanager.model.Project p : rpc.list(rpcFilterOptions).y()) { assertFalse(p.equals(nonMatchingProject1)); assertFalse(p.equals(nonMatchingProject2)); compareReadWriteFields(matchingProject, p);
synchronized Response delete(String projectId) { Project project = projects.get(projectId); if (project == null) { return Error.PERMISSION_DENIED.response( "Error when deleting " + projectId + " because the project was not found."); } if (!project.getLifecycleState().equals("ACTIVE")) { return Error.FAILED_PRECONDITION.response( "Error when deleting " + projectId + " because the lifecycle state was not ACTIVE."); } else { project.setLifecycleState("DELETE_REQUESTED"); return new Response(HTTP_OK, "{}"); } }
@Override public Object getValueAt(int row, int column) { switch (column) { case PROJECT_NAME_COLUMN: return projectList.get(row).getName(); case PROJECT_ID_COLUMN: return projectList.get(row).getProjectId(); default: return ""; } }
@Test public void testChangeLifecycleStatus() { assertFalse( RESOURCE_MANAGER_HELPER.changeLifecycleState( COMPLETE_PROJECT.getProjectId(), "DELETE_IN_PROGRESS")); rpc.create(COMPLETE_PROJECT); assertTrue( RESOURCE_MANAGER_HELPER.changeLifecycleState( COMPLETE_PROJECT.getProjectId(), "DELETE_IN_PROGRESS")); assertEquals( "DELETE_IN_PROGRESS", rpc.get(COMPLETE_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS).getLifecycleState()); try { RESOURCE_MANAGER_HELPER.changeLifecycleState( COMPLETE_PROJECT.getProjectId(), "INVALID_STATE"); fail("Should fail because of an invalid lifecycle state"); } catch (IllegalArgumentException e) { // ignore } }
.stream() .filter((project) -> !PROJECT_DELETE_REQUESTED.equals(project.getLifecycleState())) .filter((project) -> !Strings.isNullOrEmpty(project.getProjectId())) result.sort(Comparator.comparing(project -> project.getName().toLowerCase()));
private boolean resolveProject(Project project) throws IOException { final ResourceId resourceId = resourceId(project); if (isWhitelisted(resourceId)) { return true; } if (project.getParent() != null && isWhitelisted(project.getParent())) { return true; } return resolveProjectAccess(project.getProjectId()); }