Skip to content

Commit

Permalink
Dependency factory (aws#337)
Browse files Browse the repository at this point in the history
* Move skip ip check option to method argument in provider factory

* Fixed package name for kubectl client

* Add constructor to build local executable builder

* Add dependency factory

* Updated commands in cmd to use the dependency factory
  • Loading branch information
g-gaston authored and rothgar committed Nov 20, 2021
1 parent 0673dae commit 5a16768
Show file tree
Hide file tree
Showing 12 changed files with 607 additions and 287 deletions.
89 changes: 14 additions & 75 deletions cmd/eksctl-anywhere/cmd/createcluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,7 @@ import (
"github.com/spf13/pflag"
"github.com/spf13/viper"

"github.com/aws/eks-anywhere/pkg/addonmanager/addonclients"
"github.com/aws/eks-anywhere/pkg/bootstrapper"
fluxclient "github.com/aws/eks-anywhere/pkg/clients/flux"
"github.com/aws/eks-anywhere/pkg/clustermanager"
"github.com/aws/eks-anywhere/pkg/executables"
"github.com/aws/eks-anywhere/pkg/filewriter"
"github.com/aws/eks-anywhere/pkg/networking"
"github.com/aws/eks-anywhere/pkg/providers/factory"
"github.com/aws/eks-anywhere/pkg/dependencies"
"github.com/aws/eks-anywhere/pkg/validations"
"github.com/aws/eks-anywhere/pkg/workflows"
)
Expand Down Expand Up @@ -68,16 +61,6 @@ func preRunCreateCluster(cmd *cobra.Command, args []string) error {
return nil
}

type clusterManagerClient struct {
*executables.Clusterctl
*executables.Kubectl
}

type bootstrapperClient struct {
*executables.Kind
*executables.Kubectl
}

func (cc *createClusterOptions) validate(ctx context.Context) error {
clusterConfig, err := commonValidation(ctx, cc.fileName)
if err != nil {
Expand All @@ -95,71 +78,27 @@ func (cc *createClusterOptions) createCluster(ctx context.Context) error {
return err
}

writer, err := filewriter.NewWriter(clusterSpec.Name)
if err != nil {
return fmt.Errorf("unable to write: %v", err)
}
eksaToolsImage := clusterSpec.VersionsBundle.Eksa.CliTools
image := clusterSpec.UseImageMirror(eksaToolsImage.VersionedImage())
executableBuilder, err := executables.NewExecutableBuilder(ctx, image)
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
}
clusterawsadm := executableBuilder.BuildClusterAwsAdmExecutable()
kind := executableBuilder.BuildKindExecutable(writer)
clusterctl := executableBuilder.BuildClusterCtlExecutable(writer)
kubectl := executableBuilder.BuildKubectlExecutable()
govc := executableBuilder.BuildGovcExecutable(writer)
docker := executables.BuildDockerExecutable()
flux := executableBuilder.BuildFluxExecutable()

providerFactory := &factory.ProviderFactory{
AwsClient: clusterawsadm,
DockerClient: docker,
DockerKubectlClient: kubectl,
VSphereGovcClient: govc,
VSphereKubectlClient: kubectl,
Writer: writer,
SkipIpCheck: cc.skipIpCheck,
}
provider, err := providerFactory.BuildProvider(cc.fileName, clusterSpec.Cluster)
if err != nil {
return err
}

bootstrapper := bootstrapper.New(&bootstrapperClient{kind, kubectl})

clusterManager := clustermanager.New(
&clusterManagerClient{
clusterctl,
kubectl,
},
networking.NewCilium(),
writer,
)

gitOpts, err := addonclients.NewGitOptions(ctx, clusterSpec.Cluster, clusterSpec.GitOpsConfig, writer)
deps, err := dependencies.ForSpec(ctx, clusterSpec).
WithBootstrapper().
WithClusterManager().
WithProvider(cc.fileName, clusterSpec.Cluster, cc.skipIpCheck).
WithFluxAddonClient(ctx, clusterSpec.Cluster, clusterSpec.GitOpsConfig).
WithWriter().
Build()
if err != nil {
return err
}
addonClient := addonclients.NewFluxAddonClient(
&fluxclient.FluxKubectl{
Flux: flux,
Kubectl: kubectl,
},
gitOpts,
)

createCluster := workflows.NewCreate(
bootstrapper,
provider,
clusterManager,
addonClient,
writer,
deps.Bootstrapper,
deps.Provider,
deps.ClusterManager,
deps.FluxAddonClient,
deps.Writer,
)
err = createCluster.Run(ctx, clusterSpec, cc.forceClean)
if err == nil {
writer.CleanUpTemp()
deps.Writer.CleanUpTemp()
}
return err
}
71 changes: 13 additions & 58 deletions cmd/eksctl-anywhere/cmd/deletecluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,8 @@ import (
"github.com/spf13/pflag"
"github.com/spf13/viper"

"github.com/aws/eks-anywhere/pkg/addonmanager/addonclients"
"github.com/aws/eks-anywhere/pkg/bootstrapper"
"github.com/aws/eks-anywhere/pkg/cluster"
"github.com/aws/eks-anywhere/pkg/clustermanager"
"github.com/aws/eks-anywhere/pkg/executables"
"github.com/aws/eks-anywhere/pkg/filewriter"
"github.com/aws/eks-anywhere/pkg/networking"
"github.com/aws/eks-anywhere/pkg/providers/factory"
"github.com/aws/eks-anywhere/pkg/dependencies"
"github.com/aws/eks-anywhere/pkg/types"
"github.com/aws/eks-anywhere/pkg/validations"
"github.com/aws/eks-anywhere/pkg/version"
Expand Down Expand Up @@ -101,61 +95,22 @@ func (dc *deleteClusterOptions) deleteCluster(ctx context.Context) error {
return fmt.Errorf("unable to get cluster config from file: %v", err)
}

writer, err := filewriter.NewWriter(clusterSpec.Name)
if err != nil {
return fmt.Errorf("unable to write: %v", err)
}

eksaToolsImage := clusterSpec.VersionsBundle.Eksa.CliTools
image := eksaToolsImage.VersionedImage()
executableBuilder, err := executables.NewExecutableBuilder(ctx, image)
if err != nil {
return fmt.Errorf("unable initialize executables: %v", err)
}

clusterawsadm := executableBuilder.BuildClusterAwsAdmExecutable()
kind := executableBuilder.BuildKindExecutable(writer)
clusterctl := executableBuilder.BuildClusterCtlExecutable(writer)
kubectl := executableBuilder.BuildKubectlExecutable()
govc := executableBuilder.BuildGovcExecutable(writer)
docker := executables.BuildDockerExecutable()

providerFactory := &factory.ProviderFactory{
AwsClient: clusterawsadm,
DockerClient: docker,
DockerKubectlClient: kubectl,
VSphereGovcClient: govc,
VSphereKubectlClient: kubectl,
Writer: writer,
}
provider, err := providerFactory.BuildProvider(dc.fileName, clusterSpec.Cluster)
deps, err := dependencies.ForSpec(ctx, clusterSpec).
WithBootstrapper().
WithClusterManager().
WithProvider(dc.fileName, clusterSpec.Cluster, cc.skipIpCheck).
WithFluxAddonClient(ctx, clusterSpec.Cluster, clusterSpec.GitOpsConfig).
WithWriter().
Build()
if err != nil {
return err
}

bootstrapper := bootstrapper.New(&bootstrapperClient{kind, kubectl})

clusterManager := clustermanager.New(
&clusterManagerClient{
clusterctl,
kubectl,
},
networking.NewCilium(),
writer,
)

gitOpts, err := addonclients.NewGitOptions(ctx, clusterSpec.Cluster, clusterSpec.GitOpsConfig, writer)
if err != nil {
return fmt.Errorf("failed to set up git options: %v", err)
}

addonClient := addonclients.NewFluxAddonClient(nil, gitOpts)

deleteCluster := workflows.NewDelete(
bootstrapper,
provider,
clusterManager,
addonClient,
deps.Bootstrapper,
deps.Provider,
deps.ClusterManager,
deps.FluxAddonClient,
)

// Initialize Workload cluster type
Expand All @@ -165,7 +120,7 @@ func (dc *deleteClusterOptions) deleteCluster(ctx context.Context) error {
}
err = deleteCluster.Run(ctx, workloadCluster, clusterSpec, viper.GetBool("force-cleanup"))
if err == nil {
writer.CleanUp()
deps.Writer.CleanUp()
}
return err
}
48 changes: 11 additions & 37 deletions cmd/eksctl-anywhere/cmd/generatebundleconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ import (

"github.com/aws/eks-anywhere/pkg/api/v1alpha1"
"github.com/aws/eks-anywhere/pkg/cluster"
"github.com/aws/eks-anywhere/pkg/executables"
"github.com/aws/eks-anywhere/pkg/filewriter"
"github.com/aws/eks-anywhere/pkg/providers/factory"
"github.com/aws/eks-anywhere/pkg/dependencies"
support "github.com/aws/eks-anywhere/pkg/support"
"github.com/aws/eks-anywhere/pkg/validations"
"github.com/aws/eks-anywhere/pkg/version"
Expand Down Expand Up @@ -89,46 +87,22 @@ func (gsbo *generateSupportBundleOptions) generateBundleConfig(ctx context.Conte
return nil, fmt.Errorf("unable to get cluster config from file: %v", err)
}

eksaToolsImage := clusterSpec.VersionsBundle.Eksa.CliTools
image := eksaToolsImage.VersionedImage()
executableBuilder, err := executables.NewExecutableBuilder(ctx, image)
if err != nil {
return nil, fmt.Errorf("unable to initialize executables: %v", err)
}

writerDir := fmt.Sprintf(clusterSpec.Name)
writer, err := filewriter.NewWriter(writerDir)
if err != nil {
return nil, fmt.Errorf("unable to write: %v", err)
}

clusterawsadm := executableBuilder.BuildClusterAwsAdmExecutable()
kubectl := executableBuilder.BuildKubectlExecutable()
govc := executableBuilder.BuildGovcExecutable(writer)
docker := executables.BuildDockerExecutable()

providerFactory := &factory.ProviderFactory{
AwsClient: clusterawsadm,
DockerClient: docker,
DockerKubectlClient: kubectl,
VSphereGovcClient: govc,
VSphereKubectlClient: kubectl,
Writer: writer,
}
provider, err := providerFactory.BuildProvider(gsbo.fileName, clusterSpec.Cluster)
deps, err := dependencies.ForSpec(ctx, clusterSpec).
WithProvider(f, clusterSpec.Cluster, cc.skipIpCheck).
WithAnalyzerFactory().
WithCollectorFactory().
WithWriter().
Build()
if err != nil {
return nil, err
}

collectorImage := clusterSpec.VersionsBundle.Eksa.DiagnosticCollector.VersionedImage()
af := support.NewAnalyzerFactory()
cf := support.NewCollectorFactory(collectorImage)
opts := support.EksaDiagnosticBundleOpts{
AnalyzerFactory: af,
CollectorFactory: cf,
Writer: writer,
AnalyzerFactory: deps.AnalyzerFactory,
CollectorFactory: deps.CollectorFactory,
Writer: deps.Writer,
}
return support.NewDiagnosticBundleFromSpec(clusterSpec, provider, gsbo.kubeConfig(clusterSpec.Name), opts)
return support.NewDiagnosticBundleFromSpec(clusterSpec, deps.Provider, gsbo.kubeConfig(clusterSpec.Name), opts)
}

func (gsbo *generateSupportBundleOptions) kubeConfig(clusterName string) string {
Expand Down
59 changes: 16 additions & 43 deletions cmd/eksctl-anywhere/cmd/supportbundle.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ import (
"github.com/spf13/viper"

"github.com/aws/eks-anywhere/pkg/cluster"
"github.com/aws/eks-anywhere/pkg/executables"
"github.com/aws/eks-anywhere/pkg/filewriter"
"github.com/aws/eks-anywhere/pkg/providers/factory"
"github.com/aws/eks-anywhere/pkg/dependencies"
support "github.com/aws/eks-anywhere/pkg/support"
"github.com/aws/eks-anywhere/pkg/validations"
"github.com/aws/eks-anywhere/pkg/version"
Expand Down Expand Up @@ -94,36 +92,27 @@ func (csbo *createSupportBundleOptions) createBundle(ctx context.Context, since,
return fmt.Errorf("unable to get cluster config from file: %v", err)
}

eksaToolsImage := clusterSpec.VersionsBundle.Eksa.CliTools
image := eksaToolsImage.VersionedImage()
executableBuilder, err := executables.NewExecutableBuilder(ctx, image)
deps, err := dependencies.ForSpec(ctx, clusterSpec).
WithProvider(csbo.fileName, clusterSpec.Cluster, cc.skipIpCheck).
WithAnalyzerFactory().
WithCollectorFactory().
WithWriter().
WithTroubleshoot().
Build()
if err != nil {
return fmt.Errorf("unable to initialize executables: %v", err)
return err
}
troubleshoot := executableBuilder.BuildTroubleshootExecutable()

writerDir := fmt.Sprintf(clusterSpec.Name)
writer, err := filewriter.NewWriter(writerDir)
if err != nil {
return fmt.Errorf("unable to write: %v", err)
opts := support.EksaDiagnosticBundleOpts{
AnalyzerFactory: deps.AnalyzerFactory,
CollectorFactory: deps.CollectorFactory,
Client: deps.Troubleshoot,
Writer: deps.Writer,
}

clusterawsadm := executableBuilder.BuildClusterAwsAdmExecutable()
kubectl := executableBuilder.BuildKubectlExecutable()
govc := executableBuilder.BuildGovcExecutable(writer)
docker := executables.BuildDockerExecutable()

providerFactory := &factory.ProviderFactory{
AwsClient: clusterawsadm,
DockerClient: docker,
DockerKubectlClient: kubectl,
VSphereGovcClient: govc,
VSphereKubectlClient: kubectl,
Writer: writer,
}
provider, err := providerFactory.BuildProvider(csbo.fileName, clusterSpec.Cluster)
supportBundle, err := support.NewDiagnosticBundle(clusterSpec, deps.Provider, csbo.kubeConfig(clusterSpec.Name), bundleConfig, opts)
if err != nil {
return err
return fmt.Errorf("failed to parse collector: %v", err)
}

var sinceTimeValue *time.Time
Expand All @@ -132,22 +121,6 @@ func (csbo *createSupportBundleOptions) createBundle(ctx context.Context, since,
return fmt.Errorf("failed parse since time: %v", err)
}

collectorImage := clusterSpec.VersionsBundle.Eksa.DiagnosticCollector.VersionedImage()
cf := support.NewCollectorFactory(collectorImage)
af := support.NewAnalyzerFactory()

opts := support.EksaDiagnosticBundleOpts{
AnalyzerFactory: af,
CollectorFactory: cf,
Client: troubleshoot,
Writer: writer,
}

supportBundle, err := support.NewDiagnosticBundle(clusterSpec, provider, csbo.kubeConfig(clusterSpec.Name), bundleConfig, opts)
if err != nil {
return fmt.Errorf("failed to parse collector: %v", err)
}

err = supportBundle.CollectAndAnalyze(ctx, sinceTimeValue)
if err != nil {
return fmt.Errorf("error while collecting and analyzing bundle: %v", err)
Expand Down
Loading

0 comments on commit 5a16768

Please sign in to comment.