1 package org.kuali.common.devops.archive.sweep.suppliers; 2 3 import static com.google.common.collect.Iterables.concat; 4 import static com.google.common.collect.Iterables.filter; 5 import static com.google.common.collect.Lists.newArrayList; 6 import static com.google.common.collect.Maps.newHashMap; 7 import static com.google.common.collect.Ordering.natural; 8 import static java.lang.String.format; 9 import static java.util.Arrays.asList; 10 import static java.util.Collections.singletonList; 11 import static org.apache.commons.lang.StringUtils.removeEnd; 12 import static org.apache.commons.lang.StringUtils.substringAfter; 13 import static org.apache.commons.lang3.StringUtils.countMatches; 14 import static org.apache.commons.lang3.StringUtils.isNotBlank; 15 import static org.kuali.common.devops.archive.sweep.Functions.hostnameToKey; 16 import static org.kuali.common.devops.jenkins.upgrade.S3.isDir; 17 import static org.kuali.common.devops.jenkins.upgrade.S3.objectsAsMap; 18 import static org.kuali.common.util.log.Loggers.newLogger; 19 20 import java.util.List; 21 import java.util.Map; 22 23 import org.kuali.common.aws.s3.S3Service; 24 import org.kuali.common.aws.s3.model.ObjectSummary; 25 import org.kuali.common.core.build.ValidatingBuilder; 26 import org.kuali.common.core.validate.annotation.IdiotProofImmutable; 27 import org.kuali.common.devops.jenkins.upgrade.model.JenkinsSummary; 28 import org.slf4j.Logger; 29 30 @IdiotProofImmutable 31 public final class JenkinsBuilder { 32 33 private static final Logger logger = newLogger(); 34 35 private final String hostname; 36 private final String bucket; 37 private final String basedir; 38 private final String timeZoneId; 39 private final S3Service s3; 40 41 public JenkinsSummary buildJenkins(List<ObjectSummary> objects) { 42 Map<String, ObjectSummary> map = objectsAsMap(objects); 43 String key = hostnameToKey().apply(hostname) + basedir + "/"; 44 ObjectSummary jenkinsHome = map.get(key); 45 String jobsDir = ".jenkins/jobs"; 46 Map<String, ObjectSummary> jobs = getSubDirs(objects, jobsDir); 47 Iterable<ObjectSummary> builds = getBuilds(objects, jobsDir, jobs.keySet()); 48 List<ObjectSummary> all = natural().immutableSortedCopy(concat(jobs.values(), builds, asList(jenkinsHome))); 49 for (ObjectSummary object : all) { 50 info("%s", object.getKey()); 51 } 52 return null; 53 } 54 55 public Iterable<ObjectSummary> getBuilds(List<ObjectSummary> objects, String jobsDir, Iterable<String> jobs) { 56 List<String> uniqueDirNames = newArrayList(); 57 for (String name : jobs) { 58 String uniqueDirName = jobsDir + "/" + name + "/builds"; 59 uniqueDirNames.add(uniqueDirName); 60 } 61 return getSubDirs(objects, uniqueDirNames).values(); 62 } 63 64 public Map<String, ObjectSummary> getSubDirs(List<ObjectSummary> objects, String uniqueDirName) { 65 return getSubDirs(objects, singletonList(uniqueDirName)); 66 } 67 68 public Map<String, ObjectSummary> getSubDirs(List<ObjectSummary> objects, Iterable<String> uniqueDirNames) { 69 Map<String, ObjectSummary> map = newHashMap(); 70 Iterable<ObjectSummary> dirs = filter(objects, isDir()); 71 for (String uniqueDirectoryName : uniqueDirNames) { 72 String separator = "/" + uniqueDirectoryName + "/"; 73 for (ObjectSummary dir : dirs) { 74 String name = removeEnd(substringAfter(dir.getKey(), separator), "/"); 75 if (isNotBlank(name) && countMatches(name, "/") == 0) { 76 map.put(name, dir); 77 } 78 } 79 } 80 return map; 81 } 82 83 public static Builder builder() { 84 return new Builder(); 85 } 86 87 private JenkinsBuilder(Builder builder) { 88 this.timeZoneId = builder.timeZoneId; 89 this.hostname = builder.hostname; 90 this.bucket = builder.bucket; 91 this.basedir = builder.basedir; 92 this.s3 = builder.s3; 93 } 94 95 public static class Builder extends ValidatingBuilder<JenkinsBuilder> { 96 97 private S3Service s3; 98 private String bucket; 99 private String timeZoneId; 100 private String hostname; 101 private String basedir; 102 103 public Builder withS3(S3Service s3) { 104 this.s3 = s3; 105 return this; 106 } 107 108 public Builder withBucket(String bucket) { 109 this.bucket = bucket; 110 return this; 111 } 112 113 public Builder withTimeZoneId(String timeZoneId) { 114 this.timeZoneId = timeZoneId; 115 return this; 116 } 117 118 public Builder withHostname(String hostname) { 119 this.hostname = hostname; 120 return this; 121 } 122 123 public Builder withBasedir(String basedir) { 124 this.basedir = basedir; 125 return this; 126 } 127 128 @Override 129 public JenkinsBuilder build() { 130 return validate(new JenkinsBuilder(this)); 131 } 132 } 133 134 public String getHostname() { 135 return hostname; 136 } 137 138 public String getTimeZoneId() { 139 return timeZoneId; 140 } 141 142 public String getBasedir() { 143 return basedir; 144 } 145 146 protected static void info(String msg, Object... args) { 147 logger.info((args == null || args.length == 0) ? msg : format(msg, args)); 148 } 149 150 public String getBucket() { 151 return bucket; 152 } 153 154 public S3Service getS3() { 155 return s3; 156 } 157 }