release/pkg/generate_spec.go (91 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// 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 pkg
import (
"net/url"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ecrpublic"
distrov1alpha1 "github.com/aws/eks-distro-build-tooling/release/api/v1alpha1"
"github.com/pkg/errors"
)
// ReleaseConfig contains metadata fields for a release
type ReleaseConfig struct {
ContainerImageRepository string
ArtifactURL string
BuildRepoSource string
ArtifactDir string
ReleaseDate time.Time
}
// GenerateComponentsTable generates a table of EKS-D components
func (r *ReleaseConfig) GenerateComponentsTable(release *distrov1alpha1.Release) (map[string]*distrov1alpha1.Component, error) {
componentsTable := map[string]*distrov1alpha1.Component{}
componentFuncs := map[string]func(distrov1alpha1.ReleaseSpec) (*distrov1alpha1.Component, error){
"kubernetes": r.GetKubernetesComponent,
"aws-iam-authenticator": r.GetAuthenticatorComponent,
"livenessprobe": r.GetLivenessprobeComponent,
"external-attacher": r.GetAttacherComponent,
"external-provisioner": r.GetProvisionerComponent,
"external-resizer": r.GetResizerComponent,
"node-driver-registrar": r.GetRegistrarComponent,
"external-snapshotter": r.GetSnapshotterComponent,
"metrics-server": r.GetMetricsServerComponent,
"cni-plugin": r.GetCniComponent,
"etcd": r.GetEtcdComponent,
"coredns": r.GetCorednsComponent,
}
for componentName, componentFunc := range componentFuncs {
component, err := componentFunc(release.Spec)
if err != nil {
return nil, errors.Wrapf(err, "Error getting %s components", componentName)
}
componentsTable[componentName] = component
}
return componentsTable, nil
}
// UpdateReleaseStatus returns a release struct
func (r *ReleaseConfig) UpdateReleaseStatus(release *distrov1alpha1.Release, componentsTable map[string]*distrov1alpha1.Component) error {
components := []distrov1alpha1.Component{}
for _, component := range componentsTable {
components = append(components, *component)
}
release.Status = distrov1alpha1.ReleaseStatus{
Date: r.ReleaseDate.Format(time.RFC3339),
Components: components,
}
return nil
}
func UpdateImageDigests(ecrPublicClient *ecrpublic.ECRPublic, r *ReleaseConfig, componentsTable map[string]*distrov1alpha1.Component) error {
for _, component := range componentsTable {
componentDer := *component
assets := componentDer.Assets
for _, asset := range assets {
if asset.Image != nil {
var imageTag string
releaseUriSplit := strings.Split(asset.Image.URI, ":")
repoName := strings.Replace(releaseUriSplit[0], r.ContainerImageRepository+"/", "", -1)
imageTag = releaseUriSplit[1]
describeImagesOutput, err := ecrPublicClient.DescribeImages(
&ecrpublic.DescribeImagesInput{
ImageIds: []*ecrpublic.ImageIdentifier{
{
ImageTag: aws.String(imageTag),
},
},
RepositoryName: aws.String(repoName),
},
)
if err != nil {
return errors.Cause(err)
}
imageDigest := describeImagesOutput.ImageDetails[0].ImageDigest
asset.Image.ImageDigest = *imageDigest
}
}
}
return nil
}
// GetURI returns an full URL for the given path
func (r *ReleaseConfig) GetURI(path string) (string, error) {
uri, err := url.Parse(r.ArtifactURL)
if err != nil {
return "", err
}
uri.Path = path
return uri.String(), nil
}