Skip to content

Commit

Permalink
Add option to use native binaries in dep factory
Browse files Browse the repository at this point in the history
  • Loading branch information
g-gaston committed Jul 8, 2022
1 parent b4f644f commit 2d8a4d6
Show file tree
Hide file tree
Showing 19 changed files with 411 additions and 130 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ mocks: export PATH := $(GO_VERSION):$(PATH)
mocks: ## Generate mocks
$(GO) install github.com/golang/mock/mockgen@v1.6.0
${GOPATH}/bin/mockgen -destination=pkg/providers/mocks/providers.go -package=mocks "github.com/aws/eks-anywhere/pkg/providers" Provider,DatacenterConfig,MachineConfig
${GOPATH}/bin/mockgen -destination=pkg/executables/mocks/executables.go -package=mocks "github.com/aws/eks-anywhere/pkg/executables" Executable,DockerClient
${GOPATH}/bin/mockgen -destination=pkg/executables/mocks/executables.go -package=mocks "github.com/aws/eks-anywhere/pkg/executables" Executable,DockerClient,DockerContainer
${GOPATH}/bin/mockgen -destination=pkg/providers/docker/mocks/client.go -package=mocks "github.com/aws/eks-anywhere/pkg/providers/docker" ProviderClient,ProviderKubectlClient
${GOPATH}/bin/mockgen -destination=pkg/providers/tinkerbell/mocks/client.go -package=mocks "github.com/aws/eks-anywhere/pkg/providers/tinkerbell" ProviderKubectlClient,SSHAuthKeyGenerator
${GOPATH}/bin/mockgen -destination=pkg/providers/cloudstack/mocks/client.go -package=mocks "github.com/aws/eks-anywhere/pkg/providers/cloudstack" ProviderCmkClient,ProviderKubectlClient
Expand Down
2 changes: 1 addition & 1 deletion cmd/eks-a-tool/cmd/validatecluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func init() {
}

func validateCluster(ctx context.Context, cluster *types.Cluster, clusterName string) error {
executableBuilder, close, err := executables.NewExecutableBuilder(ctx, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(ctx, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/eks-a-tool/cmd/versions.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func init() {
}

func versions(ctx context.Context) error {
executableBuilder, close, err := executables.NewExecutableBuilder(ctx, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(ctx, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/eks-a-tool/cmd/vspherermvms.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func init() {
}

func vsphereRmVms(ctx context.Context, clusterName string, dryRun bool) error {
executableBuilder, close, err := executables.NewExecutableBuilder(ctx, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(ctx, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/eksctl-anywhere/cmd/importimages.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func importImages(ctx context.Context, spec string) error {
de := executables.BuildDockerExecutable()

bundle := clusterSpec.VersionsBundle
executableBuilder, closer, err := executables.NewExecutableBuilder(ctx, bundle.Eksa.CliTools.VersionedImage())
executableBuilder, closer, err := executables.InitInDockerExecutablesBuilder(ctx, bundle.Eksa.CliTools.VersionedImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/pkg/vsphere/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type NetworkMapping struct {

func DeployTemplate(envMap map[string]string, library, templateName, vmName, deployFolder, datacenter, datastore, resourcePool string, opts OVFDeployOptions) error {
context := context.Background()
executableBuilder, close, err := executables.NewExecutableBuilder(context, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(context, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand All @@ -57,7 +57,7 @@ func DeployTemplate(envMap map[string]string, library, templateName, vmName, dep

func TagVirtualMachine(envMap map[string]string, vmPath, tag string) error {
context := context.Background()
executableBuilder, close, err := executables.NewExecutableBuilder(context, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(context, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/test/cleanup/cleanup.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func CleanUpVsphereTestResources(ctx context.Context, clusterName string) error

func VsphereRmVms(ctx context.Context, clusterName string, opts ...executables.GovcOpt) error {
logger.V(1).Info("Deleting vsphere vcenter vms")
executableBuilder, close, err := executables.NewExecutableBuilder(ctx, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(ctx, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand All @@ -86,7 +86,7 @@ func VsphereRmVms(ctx context.Context, clusterName string, opts ...executables.G
}

func CleanUpCloudstackTestResources(ctx context.Context, clusterName string, dryRun bool) error {
executableBuilder, close, err := executables.NewExecutableBuilder(ctx, executables.DefaultEksaImage())
executableBuilder, close, err := executables.InitInDockerExecutablesBuilder(ctx, executables.DefaultEksaImage())
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
Expand Down
6 changes: 1 addition & 5 deletions manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,7 @@ func main() {

func setupReconcilers(ctx context.Context, mgr ctrl.Manager) {
if features.IsActive(features.FullLifecycleAPI()) {
// This feature doesn't support running the binaries through docker on the controller image so relying on the
// binaries built within the controller image instead. We also can specify a fake executable image for now in
// order to get the dependencies to build.
os.Setenv("MR_TOOLS_DISABLE", "true")
factory := dependencies.NewFactory().UseExecutableImage("test.com/fake-image:1.0")
factory := dependencies.NewFactory().WithLocalExecutables()
deps, err := factory.WithGovc().Build(ctx)
if err != nil {
setupLog.Error(err, "unable to build dependencies")
Expand Down
55 changes: 44 additions & 11 deletions pkg/dependencies/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,10 @@ func ForSpec(ctx context.Context, clusterSpec *cluster.Spec) *Factory {
}

type Factory struct {
executableBuilder *executables.ExecutableBuilder
executableBuilder *executables.ExecutablesBuilder
executablesImage string
executablesInDocker bool
executablesDockerClient executables.DockerClient
registryMirror string
proxyConfiguration map[string]string
executablesMountDirs []string
Expand All @@ -119,8 +121,9 @@ type buildStep func(ctx context.Context) error

func NewFactory() *Factory {
return &Factory{
writerFolder: "./",
buildSteps: make([]buildStep, 0),
writerFolder: "./",
executablesInDocker: executables.ExecutablesInDocker(),
buildSteps: make([]buildStep, 0),
}
}

Expand Down Expand Up @@ -190,23 +193,51 @@ func (f *Factory) WithExecutableMountDirs(mountDirs ...string) *Factory {
return f
}

func (f *Factory) WithLocalExecutables() *Factory {
f.executablesInDocker = false
return f
}

// UserExecutablesDockerClient forces a specific DockerClient to build
// Executables as opposed to follow the normal building flow
// This is only for testing
func (f *Factory) UserExecutablesDockerClient(client executables.DockerClient) *Factory {
f.executablesDockerClient = client
return f
}

func (f *Factory) WithExecutableBuilder() *Factory {
f.WithExecutableImage()
if f.executablesInDocker {
f.WithExecutableImage().WithDocker()
}

f.buildSteps = append(f.buildSteps, func(ctx context.Context) error {
if f.executableBuilder != nil {
return nil
}

image := urls.ReplaceHost(f.executablesImage, f.registryMirror)
b, close, err := executables.NewExecutableBuilder(ctx, image, f.executablesMountDirs...)
if f.executablesInDocker {
image := urls.ReplaceHost(f.executablesImage, f.registryMirror)
b, err := executables.NewInDockerExecutablesBuilder(
f.executablesDockerClient,
image,
f.executablesMountDirs...,
)
if err != nil {
return err
}

f.executableBuilder = b
} else {
f.executableBuilder = executables.NewLocalExecutablesBuilder()
}

closer, err := f.executableBuilder.Init(ctx)
if err != nil {
return err
}
f.dependencies.closers = append(f.dependencies.closers, closer)

f.dependencies.closers = append(f.dependencies.closers, close)

f.executableBuilder = b
return nil
})

Expand Down Expand Up @@ -365,14 +396,16 @@ func (f *Factory) WithClusterAwsCli() *Factory {
}

func (f *Factory) WithDocker() *Factory {
f.WithExecutableBuilder()

f.buildSteps = append(f.buildSteps, func(ctx context.Context) error {
if f.dependencies.DockerClient != nil {
return nil
}

f.dependencies.DockerClient = executables.BuildDockerExecutable()
if f.executablesDockerClient == nil {
f.executablesDockerClient = f.dependencies.DockerClient
}

return nil
})

Expand Down
48 changes: 34 additions & 14 deletions pkg/dependencies/factory_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package dependencies_test

import (
"bytes"
"context"
"encoding/base64"
"os"
"testing"

. "github.com/onsi/gomega"
Expand Down Expand Up @@ -46,10 +46,6 @@ func newTest(t *testing.T, p provider) *factoryTest {
default:
t.Fatalf("Not a valid provider: %v", p)
}
// Disable tools image executable for the tests
if err := os.Setenv("MR_TOOLS_DISABLE", "true"); err != nil {
t.Fatal(err)
}

return &factoryTest{
WithT: NewGomegaWithT(t),
Expand All @@ -62,7 +58,7 @@ func newTest(t *testing.T, p provider) *factoryTest {
func TestFactoryBuildWithProvidervSphere(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithProvider(tt.clusterConfigFile, tt.clusterSpec.Cluster, false, tt.hardwareConfigFile, false, tt.tinkerbellBootstrapIP).
Build(context.Background())

Expand All @@ -74,7 +70,7 @@ func TestFactoryBuildWithProvidervSphere(t *testing.T) {
func TestFactoryBuildWithProviderTinkerbell(t *testing.T) {
tt := newTest(t, tinkerbell)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithProvider(tt.clusterConfigFile, tt.clusterSpec.Cluster, false, tt.hardwareConfigFile, false, tt.tinkerbellBootstrapIP).
Build(context.Background())

Expand All @@ -88,7 +84,7 @@ func TestFactoryBuildWithProviderTinkerbell(t *testing.T) {
func TestFactoryBuildWithClusterManager(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithCliConfig(&tt.cliConfig).
WithClusterManager(tt.clusterSpec.Cluster).
Build(context.Background())
Expand All @@ -100,7 +96,7 @@ func TestFactoryBuildWithClusterManager(t *testing.T) {
func TestFactoryBuildWithClusterManagerWithoutCliConfig(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithClusterManager(tt.clusterSpec.Cluster).
Build(context.Background())

Expand All @@ -115,7 +111,7 @@ func TestFactoryBuildWithMultipleDependencies(t *testing.T) {

tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithBootstrapper().
WithCliConfig(&tt.cliConfig).
WithClusterManager(tt.clusterSpec.Cluster).
Expand Down Expand Up @@ -153,7 +149,7 @@ func TestFactoryBuildWithMultipleDependencies(t *testing.T) {
func TestFactoryBuildWithRegistryMirror(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithRegistryMirror("1.2.3.4:443").
WithHelmInsecure().
Build(context.Background())
Expand Down Expand Up @@ -184,7 +180,7 @@ func TestFactoryBuildWithPackageInstaller(t *testing.T) {
}
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithHelmInsecure().
WithKubectl().
WithPackageInstaller(spec, "/test/packages.yaml").
Expand All @@ -196,7 +192,7 @@ func TestFactoryBuildWithPackageInstaller(t *testing.T) {
func TestFactoryBuildWithCuratedPackagesCustomRegistry(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithHelmInsecure().
WithCuratedPackagesRegistry("test_host:8080", "1.22", version.Info{GitVersion: "1.19"}).
Build(context.Background())
Expand All @@ -208,11 +204,35 @@ func TestFactoryBuildWithCuratedPackagesCustomRegistry(t *testing.T) {
func TestFactoryBuildWithCuratedPackagesDefaultRegistry(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UseExecutableImage("image:1").
WithLocalExecutables().
WithManifestReader().
WithCuratedPackagesRegistry("", "1.22", version.Info{GitVersion: "1.19"}).
Build(context.Background())

tt.Expect(err).To(BeNil())
tt.Expect(deps.BundleRegistry).NotTo(BeNil())
}

func TestFactoryBuildWithExecutablesUsingDocker(t *testing.T) {
tt := newTest(t, vsphere)
deps, err := dependencies.NewFactory().
UserExecutablesDockerClient(dummyDockerClient{}).
UseExecutableImage("myimage").
WithGovc().
WithHelmSecure().
Build(context.Background())

tt.Expect(err).To(BeNil())
tt.Expect(deps.Govc).NotTo(BeNil())
tt.Expect(deps.HelmSecure).NotTo(BeNil())
}

type dummyDockerClient struct{}

func (b dummyDockerClient) PullImage(ctx context.Context, image string) error {
return nil
}

func (b dummyDockerClient) Execute(ctx context.Context, args ...string) (stdout bytes.Buffer, err error) {
return bytes.Buffer{}, nil
}
Loading

0 comments on commit 2d8a4d6

Please sign in to comment.