-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
222 additions
and
1 deletion.
There are no files selected for viewing
15 changes: 15 additions & 0 deletions
15
.../groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/image/FindImageFromNameStage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.netflix.spinnaker.orca.clouddriver.pipeline.image; | ||
|
||
import com.netflix.spinnaker.orca.clouddriver.tasks.image.FindImageFromNameTask; | ||
import com.netflix.spinnaker.orca.pipeline.StageDefinitionBuilder; | ||
import com.netflix.spinnaker.orca.pipeline.TaskNode; | ||
import com.netflix.spinnaker.orca.pipeline.model.Stage; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
public class FindImageFromNameStage implements StageDefinitionBuilder { | ||
@Override | ||
public void taskGraph(Stage stage, TaskNode.Builder builder) { | ||
builder.withTask("findImage", FindImageFromNameTask.class); | ||
} | ||
} |
96 changes: 96 additions & 0 deletions
96
...main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/image/FindImageFromNameTask.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
package com.netflix.spinnaker.orca.clouddriver.tasks.image; | ||
|
||
import com.netflix.spinnaker.orca.ExecutionStatus; | ||
import com.netflix.spinnaker.orca.RetryableTask; | ||
import com.netflix.spinnaker.orca.TaskResult; | ||
import com.netflix.spinnaker.orca.clouddriver.tasks.AbstractCloudProviderAwareTask; | ||
import com.netflix.spinnaker.orca.pipeline.model.Stage; | ||
import com.netflix.spinnaker.kork.artifacts.model.Artifact; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.netflix.spinnaker.kork.artifacts.model.Artifact; | ||
import java.util.*; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
public class FindImageFromNameTask extends AbstractCloudProviderAwareTask implements RetryableTask { | ||
|
||
@Autowired | ||
ObjectMapper objectMapper; | ||
|
||
@Autowired | ||
List<ImageFinder> imageFinders; | ||
|
||
@Value("${tasks.findImageFromNameTimeoutMillis:10000}") | ||
private Long findImageFromNameTimeoutMillis; | ||
|
||
@Override | ||
public TaskResult execute(Stage stage) { | ||
String cloudProvider = getCloudProvider(stage); | ||
ImageFinder imageFinder = imageFinders.stream() | ||
.filter(it -> it.getCloudProvider().equals(cloudProvider)) | ||
.findFirst() | ||
.orElseThrow(() -> new IllegalStateException("ImageFinder not found for cloudProvider " + cloudProvider)); | ||
FindImageFromNameTask.StageData stageData = (FindImageFromNameTask.StageData) stage.mapTo(FindImageFromNameTask.StageData.class); | ||
Collection<ImageFinder.ImageDetails> imageDetails = imageFinder.byName(stage, stageData.packageName, stageData.imageName); | ||
|
||
if (imageDetails == null || imageDetails.isEmpty()) { | ||
throw new IllegalStateException("Could not find named image for package: " + stageData.packageName + " and name: " + stageData.imageName); | ||
} | ||
|
||
List<Artifact> artifacts = new ArrayList<>(); | ||
imageDetails.forEach(imageDetail -> artifacts.add(generateArtifactFrom(imageDetail, cloudProvider))); | ||
|
||
Map<String, Object> stageOutputs = new HashMap<>(); | ||
stageOutputs.put("amiDetails", imageDetails); | ||
stageOutputs.put("artifacts", artifacts); | ||
|
||
return new TaskResult( | ||
ExecutionStatus.SUCCEEDED, | ||
stageOutputs, | ||
Collections.singletonMap("deploymentDetails", imageDetails) | ||
); | ||
} | ||
|
||
private Artifact generateArtifactFrom(ImageFinder.ImageDetails imageDetails, String cloudProvider) { | ||
Map<String, Object> metadata = new HashMap<>(); | ||
try { | ||
ImageFinder.JenkinsDetails jenkinsDetails = imageDetails.getJenkins(); | ||
metadata.put("build_info_url", jenkinsDetails.get("host")); | ||
metadata.put("build_number", jenkinsDetails.get("number")); | ||
} catch (Exception e) { | ||
// This is either all or nothing | ||
} | ||
|
||
Artifact artifact = new Artifact(); | ||
artifact.setName(imageDetails.getImageName()); | ||
artifact.setReference(imageDetails.getImageId()); | ||
artifact.setLocation(imageDetails.getRegion()); | ||
artifact.setType(cloudProvider + "/image"); | ||
artifact.setMetadata(metadata); | ||
artifact.setUuid(UUID.randomUUID().toString()); | ||
|
||
return artifact; | ||
} | ||
|
||
@Override | ||
public long getBackoffPeriod() { | ||
return 10000; | ||
} | ||
|
||
@Override | ||
public long getTimeout() { | ||
return this.findImageFromNameTimeoutMillis; | ||
} | ||
|
||
static class StageData { | ||
@JsonProperty | ||
String packageName; | ||
|
||
@JsonProperty | ||
String imageName; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
.../com/netflix/spinnaker/orca/clouddriver/tasks/providers/tencent/TencentImageFinder.groovy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
package com.netflix.spinnaker.orca.clouddriver.tasks.providers.tencent | ||
|
||
import com.netflix.spinnaker.orca.clouddriver.OortService | ||
import com.netflix.spinnaker.orca.clouddriver.tasks.image.ImageFinder | ||
import com.netflix.spinnaker.orca.pipeline.model.Stage | ||
import java.util.stream.Collectors | ||
import org.springframework.stereotype.Component | ||
import org.springframework.beans.factory.annotation.Autowired | ||
import com.fasterxml.jackson.databind.ObjectMapper | ||
import com.fasterxml.jackson.annotation.JsonProperty | ||
|
||
|
||
@Component | ||
class TencentImageFinder implements ImageFinder { | ||
|
||
final String cloudProvider = "tencent" | ||
|
||
@Autowired | ||
OortService oortService | ||
|
||
@Autowired | ||
ObjectMapper objectMapper | ||
|
||
@Override | ||
String getCloudProvider() { | ||
return cloudProvider | ||
} | ||
|
||
|
||
@Override | ||
Collection<ImageDetails> byTags( | ||
Stage stage, String packageName, Map<String, String> tags) { | ||
//TO-DO | ||
return null | ||
} | ||
|
||
@Override | ||
Collection<ImageDetails> byName(Stage stage, String packageName, String imageName) { | ||
StageData stageData = (StageData) stage.mapTo(StageData.class) | ||
List<TencentCloudImage> allMatchedImages = | ||
oortService.findImage(getCloudProvider(), packageName, null, null, ['imageName':imageName]) | ||
.stream() | ||
.map({ objectMapper.convertValue(it, TencentCloudImage.class)} ) | ||
.collect(Collectors.toList()) | ||
|
||
if (allMatchedImages.size() > 0) { | ||
TencentCloudImage latestImage = allMatchedImages[0] | ||
return Collections.singletonList(latestImage.toTencentCloudImageDetails()) | ||
} else { | ||
return null | ||
} | ||
} | ||
|
||
private static class TencentCloudImage { | ||
@JsonProperty | ||
String imageName | ||
|
||
@JsonProperty | ||
Map<String, Object> attributes | ||
|
||
ImageDetails toTencentCloudImageDetails() { | ||
JenkinsDetails jenkinsDetails = new JenkinsDetails("", "", "") | ||
String imageId = attributes.get("imageId").toString() | ||
return new TencentImageDetails(imageName, imageId, jenkinsDetails) | ||
} | ||
|
||
} | ||
|
||
private static class TencentImageDetails extends HashMap<String, Object> implements ImageDetails{ | ||
|
||
TencentImageDetails (String imageName, String imageId, JenkinsDetails jenkinsDetails) { | ||
put("imageName", imageName) | ||
put("imageId", imageId) | ||
put("ami", imageId) | ||
put("amiId", imageName) | ||
put("region", "global") | ||
put("jenkins", jenkinsDetails) | ||
} | ||
@Override | ||
String getImageId() { | ||
return (String) super.get("imageId") | ||
} | ||
|
||
@Override | ||
String getImageName() { | ||
return (String) super.get("imageName") | ||
} | ||
|
||
@Override | ||
String getRegion() { | ||
return (String) super.get("region") | ||
} | ||
|
||
@Override | ||
JenkinsDetails getJenkins() { | ||
return (JenkinsDetails) super.get("jenkins") | ||
} | ||
} | ||
|
||
static class StageData { | ||
@JsonProperty | ||
Collection<String> regions | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters