private void validateGroupNameUniqueness(List<PipelineConfigs> parts) { String name = parts.get(0).getGroup(); for (PipelineConfigs part : parts) { String otherName = part.getGroup(); if (!StringUtils.equals(otherName, name)) throw new IllegalArgumentException("Group names must be the same in merge"); } }
public static void toJSON(OutputWriter jsonWriter, PipelineConfigs group) { jsonWriter.addLinks(linksWriter -> linksWriter .addLink("self", Routes.PipelineGroupsAdmin.name(group.getGroup())) .addAbsoluteLink("doc", Routes.PipelineGroupsAdmin.DOC) .addLink("find", Routes.PipelineGroupsAdmin.find()) ); jsonWriter.add("name", group.getGroup()); jsonWriter.addChild("authorization", childWriter -> AuthorizationRepresenter.toJSON(childWriter, group.getAuthorization())); jsonWriter.addChildList("pipelines", pipelinesWriter -> PipelineConfigSummaryRepresenter.toJSON(pipelinesWriter, group.getPipelines())); }
private int getIndex(String pipelineName) { CaseInsensitiveString caseName = new CaseInsensitiveString(pipelineName); int start =0; for (PipelineConfigs part : this.parts) { int end = start + part.size(); if(part.hasPipeline(caseName)) { int internalIndex = part.indexOf(part.findBy(caseName)); return start + internalIndex; } start = end; } return -1; }
@Override public JsonElement serialize(List<PipelineConfigs> src, Type typeOfSrc, JsonSerializationContext context) { JsonObject serialized = new JsonObject(); for (PipelineConfigs group : src) { final List<PipelineConfig> pipelines = group.getPipelines(); if (!pipelines.isEmpty()) { List<CaseInsensitiveString> pipelineNames = pipelines.stream().map(PipelineConfig::name).collect(Collectors.toList()); serialized.add(group.getGroup(), context.serialize(pipelineNames)); } } return serialized; } }
private void validateOperatePermissions(ValidationContext validationContext) { if (validationContext.isWithinPipelines()) { PipelineConfigs group = validationContext.getPipelineGroup(); if (!group.hasOperationPermissionDefined()) { return; } AdminsConfig groupOperators = group.getAuthorization().getOperationConfig(); SecurityConfig serverSecurityConfig = validationContext.getServerSecurityConfig(); RolesConfig roles = serverSecurityConfig.getRoles(); for (Admin approver : authConfig) { boolean approverIsASuperAdmin = serverSecurityConfig.isAdmin(approver); boolean approverIsAGroupAdmin = group.isUserAnAdmin(approver.getName(), roles.memberRoles(approver)); boolean approverIsNotAnAdmin = !(approverIsASuperAdmin || approverIsAGroupAdmin); boolean approverIsNotAGroupOperator = !groupOperators.has(approver, roles.memberRoles(approver)); if (approverIsNotAnAdmin && approverIsNotAGroupOperator) { approver.addError(String.format("%s \"%s\" who is not authorized to operate pipeline group `%s` can not be authorized to approve stage", approver.describe(), approver, group.getGroup())); } } } }
@Test public void shouldAddAuthorizationToPipelinesConfigForEditsWithUIOrigin_WhenFileHasNoPipelineGroupYet_AndForEdit() { BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(); // only remotely defined group PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipe1", "group1"); partialConfig.setOrigins(new RepoConfigOrigin()); cruiseConfig = new BasicCruiseConfig(mainCruiseConfig, true, partialConfig); assertThat(cruiseConfig.getGroups().size(), is(1)); assertThat(cruiseConfig.getGroups().get(0) instanceof MergePipelineConfigs, is(true)); assertThat(cruiseConfig.getGroups().get(0).getGroup(), is("group1")); MergePipelineConfigs mergedEnv = (MergePipelineConfigs) cruiseConfig.getGroups().get(0); assertThat(mergedEnv.getLocal().getOrigin(), is(new UIConfigOrigin())); Authorization authorization = new Authorization(new AdminsConfig( new AdminUser(new CaseInsensitiveString("firstTemplate-admin")))); cruiseConfig.getGroups().get(0).setAuthorization(authorization); assertThat(mergedEnv.getLocal().getAuthorization(), is(authorization)); }
public ModelAndView index(Request request, Response response) { HashMap<String, String> locals = new HashMap<String, String>() {{ List<String> pipelines = new ArrayList<>(); pipelineConfigService.viewableGroupsFor(SessionUtils.currentUsername()).forEach( (PipelineConfigs config) -> config.getPipelines().forEach( (p) -> pipelines.add(p.name().toString()) ) ); put("viewTitle", "Analytics"); put("pipelines", GSON.toJson(pipelines)); }}; return new ModelAndView(locals, "analytics/index.vm"); }
@Test public void shouldRemovePipelineAtIndex() { PipelineConfigs group = createWithPipeline(PipelineConfigMother.pipelineConfig("pipeline0")); PipelineConfig p1 = PipelineConfigMother.pipelineConfig("pipeline1"); group.add(1,p1); group.remove(0); assertThat(group.get(0), is(p1)); assertThat(group.size(), is(1)); }
@Test public void shouldReturnIndexOfPipeline() { PipelineConfigs group = createWithPipeline(PipelineConfigMother.pipelineConfig("pipeline1")); PipelineConfig pipelineConfig = (PipelineConfig) group.get(0).clone(); pipelineConfig.setLabelTemplate("blah"); group.update(group.getGroup(), pipelineConfig, "pipeline1"); assertThat(group.get(0).getLabelTemplate(), is("blah")); }
@Test public void shouldReturnFalseIfViewPermissionIsNotDefined() { PipelineConfigs group = createWithPipeline(PipelineConfigMother.pipelineConfig("pipeline1")); group.getAuthorization().getOperationConfig().add(new AdminUser(new CaseInsensitiveString("jez"))); assertThat(group.hasViewPermission(new CaseInsensitiveString("jez"), null), is(false)); }
public PipelineConfigs updateGroupAuthorization(Username currentUser, PipelineConfigs newPipelineConfigs, String existingMd5, EntityHashingService entityHashingService, SecurityService securityService, LocalizedOperationResult result) { UpdatePipelineConfigsAuthCommand updatePipelineConfigsCommand = new UpdatePipelineConfigsAuthCommand(newPipelineConfigs.getGroup(), newPipelineConfigs.getAuthorization(), result, currentUser, existingMd5, entityHashingService, securityService); update(currentUser, newPipelineConfigs, result, updatePipelineConfigsCommand); return updatePipelineConfigsCommand.getPreprocessedEntityConfig(); }
public void visit(PipelineConfigs pipelineConfigs) { if (pipelineConfigs.getAuthorization().isUserAnAdmin(username, roles)) { isGroupAdmin = true; } } }
@Test public void shouldReturnFalseIfOperatePermissionIsNotDefined() { PipelineConfigs group = createWithPipeline(PipelineConfigMother.pipelineConfig("pipeline1")); group.getAuthorization().getViewConfig().add(new AdminUser(new CaseInsensitiveString("jez"))); assertThat(group.hasOperatePermission(new CaseInsensitiveString("jez"), null), is(false)); }
@Override public Map<CaseInsensitiveString, Map<CaseInsensitiveString, Authorization>> templatesWithAssociatedPipelines() { if (allTemplatesWithAssociatedPipelines == null) { allTemplatesWithAssociatedPipelines = new AllTemplatesWithAssociatedPipelines(); for (PipelineTemplateConfig templateConfig : getTemplates()) { if (!allTemplatesWithAssociatedPipelines.containsKey(templateConfig.name())) { allTemplatesWithAssociatedPipelines.put(templateConfig.name(), new HashMap<>()); } } for (PipelineConfigs pipelineConfigs : getGroups()) { List<PipelineConfig> pipelines = pipelineConfigs.getPipelines(); for (PipelineConfig pipeline : pipelines) { if (pipeline.hasTemplate()) { Map<CaseInsensitiveString, Authorization> authorizationMap = allTemplatesWithAssociatedPipelines.get(pipeline.getTemplateName()); authorizationMap.put(pipeline.getName(), pipelineConfigs.getAuthorization()); } } } } return allTemplatesWithAssociatedPipelines; }
@Override public List<String> getGroupsForUser(CaseInsensitiveString username, List<Role> roles) { ArrayList<String> groups = new ArrayList<>(); for (PipelineConfigs group : this.groups) { if (isAdministrator(username.toString()) || group.isUserAnAdmin(username, roles)) { groups.add(group.getGroup()); } } return groups; }
@Override public List<PipelineConfig> getAllLocalPipelineConfigs(boolean excludeMembersOfRemoteEnvironments) { List<PipelineConfig> locals = new ArrayList<>(); PipelineGroups localGroups = BasicCruiseConfig.this.groups.getLocal(); for (PipelineConfigs pipelineConfigs : localGroups) { if (pipelineConfigs.getOrigin() instanceof UIConfigOrigin) { //then we have injected this so that UI has a piece to edit // we want to keep it only if there is something added if (!pipelineConfigs.isEmpty()) { for (PipelineConfig pipelineConfig : pipelineConfigs.getPipelines()) { if (excludeMembersOfRemoteEnvironments && BasicCruiseConfig.this.getEnvironments().isPipelineAssociatedWithRemoteEnvironment(pipelineConfig.name())) continue; locals.add(pipelineConfig); } } } else { //origin is local file for (PipelineConfig pipelineConfig : pipelineConfigs.getPipelines()) { if (excludeMembersOfRemoteEnvironments && BasicCruiseConfig.this.getEnvironments().isPipelineAssociatedWithRemoteEnvironment(pipelineConfig.name())) continue; locals.add(pipelineConfig); } } } return locals; }
public PipelineConfig findPipeline(String groupName, int pipelineIndex) { return findGroup(groupName).get(pipelineIndex); }
@Test public void shouldUpdateName() { PipelineConfigs group = createWithPipeline(PipelineConfigMother.pipelineConfig("pipeline1")); group.setConfigAttributes(m(BasicPipelineConfigs.GROUP, "my-new-group")); assertThat(group.getGroup(), is("my-new-group")); group.setConfigAttributes(m()); assertThat(group.getGroup(), is("my-new-group")); group.setConfigAttributes(null); assertThat(group.getGroup(), is("my-new-group")); group.setConfigAttributes(m(BasicPipelineConfigs.GROUP, null)); assertThat(group.getGroup(), is(nullValue())); }