Skip to content

Commit

Permalink
last partial, start testing
Browse files Browse the repository at this point in the history
  • Loading branch information
adrianriobo committed Nov 13, 2023
1 parent ee8fc19 commit 8d124d2
Show file tree
Hide file tree
Showing 22 changed files with 429 additions and 283 deletions.
4 changes: 2 additions & 2 deletions cmd/cmd/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package aws

import (
"github.com/adrianriobo/qenvs/cmd/cmd/aws/host"
"github.com/adrianriobo/qenvs/cmd/cmd/aws/mac"
"github.com/adrianriobo/qenvs/cmd/cmd/aws/hosts"
"github.com/adrianriobo/qenvs/cmd/cmd/aws/replica"
"github.com/spf13/cobra"
"github.com/spf13/viper"
Expand All @@ -28,6 +28,6 @@ func GetCmd() *cobra.Command {
c.AddCommand(
replica.GetCmd(),
host.GetCmd(),
mac.GetCmd())
hosts.GetMacCmd())
return c
}
8 changes: 8 additions & 0 deletions cmd/cmd/aws/hosts/constans.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package hosts

const (
spot string = "spot"
spotDesc string = "if this flag is set the host will be created only on the region set by the AWS Env (AWS_DEFAULT_REGION)"
airgap string = "airgap"
airgapDesc string = "if this flag is set the host will be created as airgap machine. Access will done through a bastion"
)
24 changes: 11 additions & 13 deletions cmd/cmd/aws/mac/mac.go → cmd/cmd/aws/hosts/mac.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package mac
package hosts

import (
"fmt"
Expand All @@ -13,8 +13,8 @@ import (
)

const (
cmd = "mac"
cmdDesc = "create mac instances"
cmdMac = "mac"
cmdMacDesc = "create mac instances"
checkStateCmd = "check-state"
checkStateCmdDesc = "check the state for a dedicated mac machine"

Expand All @@ -32,26 +32,24 @@ const (
onlyMachineDesc string = "if this flag is set only the machine will be destroyed"
fixedLocation string = "fixed-location"
fixedLocationDesc string = "if this flag is set the host will be created only on the region set by the AWS Env (AWS_DEFAULT_REGION)"
airgap string = "airgap"
airgapDesc string = "if this flag is set the host will be created as airgap machine. Access will done through a bastion"
)

func GetCmd() *cobra.Command {
func GetMacCmd() *cobra.Command {
c := &cobra.Command{
Use: cmd,
Short: cmdDesc,
Use: cmdMac,
Short: cmdMacDesc,
RunE: func(cmd *cobra.Command, args []string) error {
if err := viper.BindPFlags(cmd.Flags()); err != nil {
return err
}
return nil
},
}
c.AddCommand(getCreate(), getDestroy(), getCheckState())
c.AddCommand(getMacCreate(), getMacDestroy(), getMacCheckState())
return c
}

func getCheckState() *cobra.Command {
func getMacCheckState() *cobra.Command {
c := &cobra.Command{
Use: checkStateCmd,
Short: checkStateCmdDesc,
Expand All @@ -77,7 +75,7 @@ func getCheckState() *cobra.Command {
return c
}

func getCreate() *cobra.Command {
func getMacCreate() *cobra.Command {
c := &cobra.Command{
Use: params.CreateCmdName,
Short: params.CreateCmdName,
Expand Down Expand Up @@ -123,7 +121,7 @@ func getCreate() *cobra.Command {
return c
}

func getDestroy() *cobra.Command {
func getMacDestroy() *cobra.Command {
c := &cobra.Command{
Use: params.DestroyCmdName,
Short: params.DestroyCmdName,
Expand All @@ -146,7 +144,7 @@ func getDestroy() *cobra.Command {
return nil
},
}
flagSet := pflag.NewFlagSet(params.CreateCmdName, pflag.ExitOnError)
flagSet := pflag.NewFlagSet(params.DestroyCmdName, pflag.ExitOnError)
flagSet.Bool(onlyHost, false, onlyHostDesc)
flagSet.Bool(onlyMachine, false, onlyMachineDesc)
c.PersistentFlags().AddFlagSet(flagSet)
Expand Down
105 changes: 105 additions & 0 deletions cmd/cmd/aws/hosts/windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package hosts

import (
params "github.com/adrianriobo/qenvs/cmd/cmd/constants"
qenvsContext "github.com/adrianriobo/qenvs/pkg/manager/context"
"github.com/adrianriobo/qenvs/pkg/provider/aws/action/windows"
"github.com/adrianriobo/qenvs/pkg/util/logging"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)

const (
cmdWindows = "windows"
cmdWindowsDesc = "create windows dedicated host"

amiName string = "ami-name"
amiNameDesc string = "name for the custom ami to be used within windows machine. Check README on how to build it"
amiNameDefault string = "Windows_Server-2019-English-Full-HyperV*"
amiUsername string = "ami-username"
amiUsernameDesc string = "name for de default user on the custom AMI"
amiUsernameDefault string = "ec2-user"
amiOwner string = "ami-owner"
amiOwnerDesc string = "alias name for the owner of the custom AMI"
amiOwnerDefault string = "self"
)

func GetWindowsCmd() *cobra.Command {
c := &cobra.Command{
Use: cmdWindows,
Short: cmdWindowsDesc,
RunE: func(cmd *cobra.Command, args []string) error {
if err := viper.BindPFlags(cmd.Flags()); err != nil {
return err
}
return nil
},
}
c.AddCommand(getWindowsCreate(), getWindowsDestroy())
return c
}

func getWindowsCreate() *cobra.Command {
c := &cobra.Command{
Use: params.CreateCmdName,
Short: params.CreateCmdName,
RunE: func(cmd *cobra.Command, args []string) error {
if err := viper.BindPFlags(cmd.Flags()); err != nil {
return err
}

// Initialize context
qenvsContext.Init(
viper.GetString(params.ProjectName),
viper.GetString(params.BackedURL),
viper.GetString(params.ConnectionDetailsOutput),
viper.GetStringMapString(params.Tags))

// Run create
if err := windows.Create(
&windows.WindowsRequest{
Prefix: "main",
AMIName: viper.GetString(amiName),
AMIUser: viper.GetString(amiUsername),
AMIOwner: viper.GetString(amiOwner),
Spot: viper.IsSet(spot),
Airgap: viper.IsSet(airgap)}); err != nil {
logging.Error(err)
}
return nil
},
}
flagSet := pflag.NewFlagSet(params.CreateCmdName, pflag.ExitOnError)
flagSet.StringP(params.ConnectionDetailsOutput, "", "", params.ConnectionDetailsOutputDesc)
flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc)
flagSet.StringP(amiName, "", amiNameDefault, amiNameDesc)
flagSet.StringP(amiUsername, "", amiUsernameDefault, amiUsernameDesc)
flagSet.StringP(amiOwner, "", amiOwnerDefault, amiOwnerDesc)
flagSet.Bool(airgap, false, airgapDesc)
flagSet.Bool(spot, false, spotDesc)
c.PersistentFlags().AddFlagSet(flagSet)
return c
}

func getWindowsDestroy() *cobra.Command {
c := &cobra.Command{
Use: params.DestroyCmdName,
Short: params.DestroyCmdName,
RunE: func(cmd *cobra.Command, args []string) error {
if err := viper.BindPFlags(cmd.Flags()); err != nil {
return err
}

qenvsContext.InitBase(
viper.GetString(params.ProjectName),
viper.GetString(params.BackedURL))

if err := windows.Destroy(); err != nil {
logging.Error(err)
}
return nil
},
}
return c
}
13 changes: 10 additions & 3 deletions pkg/manager/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,15 @@ func GetTags() map[string]string {
return c.tags
}

func GetTagsAsPulumiStringMap(customTags map[string]string) pulumi.StringMap {
var lTags map[string]string
// Get tags ready to be added to any pulumi resource
func ResourceTags() pulumi.StringMap {
return ResourceTagsWithCustom(nil)
}

// Get tags ready to be added to any pulumi resource
// in addition we cas set specific custom tags
func ResourceTagsWithCustom(customTags map[string]string) pulumi.StringMap {
lTags := make(map[string]string)
maps.Copy(lTags, c.tags)
if customTags != nil {
maps.Copy(lTags, customTags)
Expand All @@ -75,7 +82,7 @@ func GetBackedURL() string {
return c.backedURL
}

func GetResultsOutput() string {
func GetResultsOutputPath() string {
return c.resultsOutput
}

Expand Down
10 changes: 4 additions & 6 deletions pkg/provider/aws/action/mac/mac-dh.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ func (r *MacRequest) createDedicatedHost() (*string, *string, error) {
return nil, nil, err
}
dhID, dhAZ, err := r.manageResultsDedicatedHost(
csResult,
qenvsContext.GetResultsOutput())
csResult)
if err != nil {
return nil, nil, err
}
Expand All @@ -54,7 +53,7 @@ func (r *MacRequest) deployerDedicatedHost(ctx *pulumi.Context) (err error) {
AutoPlacement: pulumi.String("off"),
AvailabilityZone: pulumi.String(*az),
InstanceType: pulumi.String(macTypesByArch[r.Architecture]),
Tags: qenvsContext.GetTagsAsPulumiStringMap(nil),
Tags: qenvsContext.ResourceTags(),
})
ctx.Export(fmt.Sprintf("%s-%s", r.Prefix, outputDedicatedHostID), dh.ID())
ctx.Export(fmt.Sprintf("%s-%s", r.Prefix, outputDedicatedHostAZ), pulumi.String(*az))
Expand All @@ -66,9 +65,8 @@ func (r *MacRequest) deployerDedicatedHost(ctx *pulumi.Context) (err error) {

// results for dedicated host it will return dedicatedhost ID and dedicatedhost AZ
// also write results to files on the target folder
func (r *MacRequest) manageResultsDedicatedHost(stackResult auto.UpResult,
destinationFolder string) (*string, *string, error) {
if err := output.Write(stackResult, destinationFolder, map[string]string{
func (r *MacRequest) manageResultsDedicatedHost(stackResult auto.UpResult) (*string, *string, error) {
if err := output.Write(stackResult, qenvsContext.GetResultsOutputPath(), map[string]string{
fmt.Sprintf("%s-%s", r.Prefix, outputDedicatedHostID): "dedicatedHostID",
}); err != nil {
return nil, nil, err
Expand Down
25 changes: 12 additions & 13 deletions pkg/provider/aws/action/mac/mac-machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ func (r *MacRequest) createMacMachine() error {
if err != nil {
return err
}
err = r.manageResultsMachine(
csResult, qenvsContext.GetResultsOutput())
err = r.manageResultsMachine(csResult)
if err != nil {
return err
}
Expand Down Expand Up @@ -150,20 +149,20 @@ func (r *MacRequest) deployerMachine(ctx *pulumi.Context) error {
}

// Write exported values in context to files o a selected target folder
func (r *MacRequest) manageResultsMachine(stackResult auto.UpResult,
destinationFolder string) error {
func (r *MacRequest) manageResultsMachine(stackResult auto.UpResult) error {
results := map[string]string{
fmt.Sprintf("%s-%s", r.Prefix, outputUsername): "username",
fmt.Sprintf("%s-%s", r.Prefix, outputUserPassword): "userpassword",
fmt.Sprintf("%s-%s", r.Prefix, outputUserPrivateKey): "id_rsa",
fmt.Sprintf("%s-%s", r.Prefix, outputHost): "host",
}
if r.Airgap {
results[fmt.Sprintf("%s-%s", r.Prefix, bastion.OutputBastionUserPrivateKey)] = "bastion_id_rsa"
results[fmt.Sprintf("%s-%s", r.Prefix, bastion.OutputBastionUsername)] = "bastion_username"
results[fmt.Sprintf("%s-%s", r.Prefix, bastion.OutputBastionHost)] = "bastion_host"
err := bastion.WriteOutputs(stackResult, r.Prefix, qenvsContext.GetResultsOutputPath())
if err != nil {
return err
}
}
return output.Write(stackResult, destinationFolder, results)
return output.Write(stackResult, qenvsContext.GetResultsOutputPath(), results)
}

// this function will return the AZ for the dedicated host
Expand Down Expand Up @@ -235,7 +234,7 @@ func (r *MacRequest) instance(ctx *pulumi.Context,
RootBlockDevice: ec2.InstanceRootBlockDeviceArgs{
VolumeSize: pulumi.Int(diskSize),
},
Tags: qenvsContext.GetTagsAsPulumiStringMap(nil),
Tags: qenvsContext.ResourceTags(),
}
if r.Airgap {
instanceArgs.AssociatePublicIpAddress = pulumi.Bool(false)
Expand All @@ -248,7 +247,7 @@ func (r *MacRequest) instance(ctx *pulumi.Context,
func (r *MacRequest) bootstrapscript(ctx *pulumi.Context,
m *ec2.Instance,
mk *tls.PrivateKey,
b *bastion.BastionResources,
b *bastion.Bastion,
dependecies []pulumi.Resource) (
*remote.Command,
*random.RandomPassword,
Expand Down Expand Up @@ -289,7 +288,7 @@ func (r *MacRequest) getBootstrapScript(ctx *pulumi.Context) (
userDataValues{
defaultUsername,
password},
fmt.Sprintf("%s-%s", r.Prefix, outputUsername),
resourcesUtil.GetResourceName(r.Prefix, awsMacMachineID, "mac-bootstrap"),
string(BootstrapScript[:]))

}).(pulumi.StringOutput)
Expand All @@ -299,7 +298,7 @@ func (r *MacRequest) getBootstrapScript(ctx *pulumi.Context) (
func (r *MacRequest) readiness(ctx *pulumi.Context,
m *ec2.Instance,
mk *tls.PrivateKey,
b *bastion.BastionResources,
b *bastion.Bastion,
dependecies []pulumi.Resource) error {
_, err := remote.NewCommand(ctx,
resourcesUtil.GetResourceName(r.Prefix, awsMacMachineID, "readiness-cmd"),
Expand All @@ -320,7 +319,7 @@ func (r *MacRequest) readiness(ctx *pulumi.Context,
func remoteCommandArgs(
m *ec2.Instance,
mk *tls.PrivateKey,
b *bastion.BastionResources) remote.ConnectionArgs {
b *bastion.Bastion) remote.ConnectionArgs {
ca := remote.ConnectionArgs{
Host: m.PublicIp,
PrivateKey: mk.PrivateKeyOpenssh,
Expand Down
4 changes: 2 additions & 2 deletions pkg/provider/aws/action/mac/mac.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func Destroy(r *MacRequest) (err error) {
if err != nil {
return
}
if err = aws.DestroyStack(*region, stackMacMachine); err != nil {
if err = aws.DestroyStackByRegion(*region, stackMacMachine); err != nil {
return
}
}
Expand All @@ -87,7 +87,7 @@ func Destroy(r *MacRequest) (err error) {
return
}
}
return aws.DestroyStack(*region, stackDedicatedHost)
return aws.DestroyStackByRegion(*region, stackDedicatedHost)
}
return nil
}
Expand Down
12 changes: 7 additions & 5 deletions pkg/provider/aws/action/windows/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ var (

rdpDefaultPort int = 3389
diskSize int = 200
// rootBlockDeviceName string = "/dev/sda1"

// This is based on a Custom AMI
amiNameDefault = "Windows_Server-2019-English-Full-HyperV*"
amiOwner = "self"
amiDefaultUser = "ec2-user"
amiNameDefault = "Windows_Server-2019-English-Full-HyperV*"
amiOwnerDefault = "self"
amiUserDefault = "ec2-user"

// outputHost = "awdHost"
requiredInstanceTypes = []string{"c5.metal", "c5d.metal", "c5n.metal"}

outputHost = "awdHost"
outputUsername = "awdUsername"
outputUserPassword = "awdUserPassword"
outputUserPrivateKey = "awdPrivatekey"
)
Loading

0 comments on commit 8d124d2

Please sign in to comment.