/*
* Copyright 2017 ThoughtWorks, Inc.
*
* 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.
*/
package com.thoughtworks.go.config;
import com.thoughtworks.go.config.remote.ConfigOriginTraceable;
import com.thoughtworks.go.config.remote.ConfigReposConfig;
import com.thoughtworks.go.config.remote.PartialConfig;
import com.thoughtworks.go.domain.*;
import com.thoughtworks.go.domain.materials.MaterialConfig;
import com.thoughtworks.go.domain.packagerepository.PackageDefinition;
import com.thoughtworks.go.domain.packagerepository.PackageRepositories;
import com.thoughtworks.go.domain.packagerepository.PackageRepository;
import com.thoughtworks.go.domain.scm.SCM;
import com.thoughtworks.go.domain.scm.SCMs;
import com.thoughtworks.go.util.Node;
import javax.annotation.PostConstruct;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @understands the configuration for cruise
*/
public interface CruiseConfig extends Validatable, ConfigOriginTraceable {
String WORKING_BASE_DIR = "pipelines/";
void merge(List<PartialConfig> partList, boolean forEdit);
@PostConstruct
void initializeServer();
// TODO these should be removed, they suggest knowledge of config store
String getMd5();
int schemaVersion();
Set<MaterialConfig> getAllUniquePostCommitSchedulableMaterials();
ConfigReposConfig getConfigRepos();
void setConfigRepos(ConfigReposConfig repos);
void validate(ValidationContext validationContext);
Hashtable<CaseInsensitiveString, Node> getDependencyTable();
ConfigErrors errors();
void addError(String fieldName, String message);
StageConfig stageConfigByName(CaseInsensitiveString pipelineName, CaseInsensitiveString stageName);
JobConfig findJob(String pipelineName, String stageName, String jobName);
PipelineConfig pipelineConfigByName(CaseInsensitiveString name);
boolean hasStageConfigNamed(CaseInsensitiveString pipelineName, CaseInsensitiveString stageName, boolean ignoreCase);
PipelineConfig getPipelineConfigByName(CaseInsensitiveString pipelineName);
boolean hasPipelineNamed(CaseInsensitiveString pipelineName);
boolean hasNextStage(CaseInsensitiveString pipelineName, CaseInsensitiveString lastStageName);
boolean hasPreviousStage(CaseInsensitiveString pipelineName, CaseInsensitiveString stageName);
StageConfig nextStage(CaseInsensitiveString pipelineName, CaseInsensitiveString lastStageName);
StageConfig previousStage(CaseInsensitiveString pipelineName, CaseInsensitiveString lastStageName);
JobConfig jobConfigByName(String pipelineName, String stageName, String jobInstanceName, boolean ignoreCase);
Agents agents();
ServerConfig server();
MailHost mailHost();
EnvironmentsConfig getEnvironments();
List<PipelineConfig> allPipelines();
PipelineConfigs pipelines(String groupName);
boolean hasBuildPlan(CaseInsensitiveString pipelineName, CaseInsensitiveString stageName, String buildName, boolean ignoreCase);
boolean requiresApproval(CaseInsensitiveString pipelineName, CaseInsensitiveString stageName);
void accept(JobConfigVisitor visitor);
void accept(TaskConfigVisitor visitor);
void accept(PiplineConfigVisitor visitor);
void setGroup(PipelineGroups pipelineGroups);
PipelineGroups getGroups();
void addPipeline(String groupName, PipelineConfig pipelineConfig);
void addPipelineWithoutValidation(String groupName, PipelineConfig pipelineConfig);
void update(String groupName, String pipelineName, PipelineConfig pipeline);
void deletePipeline(PipelineConfig pipelineConfig);
boolean exist(int pipelineIndex);
boolean hasPipeline();
PipelineConfig find(String groupName, int pipelineIndex);
int numberOfPipelines();
int numbersOfPipeline(String groupName);
void groups(List<String> allGroup);
boolean exist(String groupName, String pipelineName);
List<Task> tasksForJob(String pipelineName, String stageName, String jobName);
boolean isSmtpEnabled();
boolean isInFirstGroup(CaseInsensitiveString pipelineName);
boolean hasMultiplePipelineGroups();
void accept(PipelineGroupVisitor visitor);
boolean isSecurityEnabled();
void setServerConfig(ServerConfig serverConfig);
String adminEmail();
boolean hasPipelineGroup(String groupName);
PipelineConfigs findGroup(String groupName);
void updateGroup(PipelineConfigs pipelineConfigs, String groupName);
boolean isMailHostConfigured();
List<PipelineConfig> getAllPipelineConfigs();
List<CaseInsensitiveString> getAllPipelineNames();
boolean isAdministrator(String username);
void setEnvironments(EnvironmentsConfig environments);
Set<MaterialConfig> getAllUniqueMaterialsBelongingToAutoPipelines();
Set<MaterialConfig> getAllUniqueMaterialsBelongingToAutoPipelinesAndConfigRepos();
Set<MaterialConfig> getAllUniqueMaterials();
Set<StageConfig> getStagesUsedAsMaterials(PipelineConfig pipelineConfig);
EnvironmentConfig addEnvironment(String environmentName);
void addEnvironment(BasicEnvironmentConfig config);
Boolean isPipelineLocked(String pipelineName);
Set<Resource> getAllResources();
TemplatesConfig getTemplates();
PipelineTemplateConfig findTemplate(CaseInsensitiveString templateName);
void addTemplate(PipelineTemplateConfig pipelineTemplate);
PipelineTemplateConfig getTemplateByName(CaseInsensitiveString pipeline);
void setTemplates(TemplatesConfig templates);
void makePipelineUseTemplate(CaseInsensitiveString pipelineName, CaseInsensitiveString templateName);
Iterable<PipelineConfig> getDownstreamPipelines(String pipelineName);
boolean hasVariableInScope(String pipelineName, String variableName);
EnvironmentVariablesConfig variablesFor(String pipelineName);
boolean isGroupAdministrator(CaseInsensitiveString userName);
List<ConfigErrors> getAllErrors();
List<ConfigErrors> getAllErrorsExceptFor(Validatable skipValidatable);
List<ConfigErrors> validateAfterPreprocess();
void copyErrorsTo(CruiseConfig to);
PipelineConfigs findGroupOfPipeline(PipelineConfig pipelineConfig);
PipelineConfig findPipelineUsingThisPipelineAsADependency(String pipelineName);
Map<String, List<PipelineConfig>> generatePipelineVsDownstreamMap();
List<PipelineConfig> pipelinesForFetchArtifacts(String pipelineName);
Map<CaseInsensitiveString, List<CaseInsensitiveString>> templatesWithPipelinesForUser(String username, List<Role> roles);
List<CaseInsensitiveString> pipelinesAssociatedWithTemplate(CaseInsensitiveString templateName);
boolean isArtifactCleanupProhibited(String pipelineName, String stageName);
MaterialConfig materialConfigFor(String fingerprint);
MaterialConfig materialConfigFor(CaseInsensitiveString pipelineName, String fingerprint);
String sanitizedGroupName(String name);
void removePackageRepository(String id);
PackageRepositories getPackageRepositories();
void savePackageRepository(PackageRepository packageRepository);
void savePackageDefinition(PackageDefinition packageDefinition);
void setPackageRepositories(PackageRepositories packageRepositories);
SCMs getSCMs();
void setSCMs(SCMs scms);
boolean canDeletePackageRepository(PackageRepository repository);
boolean canDeletePluggableSCMMaterial(SCM scmConfig);
List<PipelineConfig> getAllLocalPipelineConfigs();
void setPartials(List<PartialConfig> partials);
List<PartialConfig> getPartials();
List<PipelineConfig> getAllLocalPipelineConfigs(boolean excludeMembersOfRemoteEnvironments);
boolean isLocal();
/**
* Gets remote config parts currently active in this configuration.
* Note: It does NOT guarantee that these partials are valid.
*/
List<PartialConfig> getMergedPartials();
CruiseConfig cloneForValidation();
boolean canViewAndEditTemplates(CaseInsensitiveString username);
boolean isAuthorizedToEditTemplate(String templateName, CaseInsensitiveString username);
boolean isAuthorizedToViewTemplate(String templateName, CaseInsensitiveString username);
boolean isAuthorizedToViewTemplates(CaseInsensitiveString username);
}