Skip to content

Commit 433f7f1

Browse files
committed
feat: Kind offering on Azure
Signed-off-by: Adrian Riobo <[email protected]>
1 parent d102d1f commit 433f7f1

File tree

9 files changed

+208
-61
lines changed

9 files changed

+208
-61
lines changed

cmd/mapt/cmd/aws/services/kind.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55

66
"github.com/redhat-developer/mapt/cmd/mapt/cmd/params"
77
maptContext "github.com/redhat-developer/mapt/pkg/manager/context"
8+
kindApi "github.com/redhat-developer/mapt/pkg/provider/api/k8s/kind"
89
"github.com/redhat-developer/mapt/pkg/provider/aws/action/kind"
9-
kindCloudConfig "github.com/redhat-developer/mapt/pkg/provider/util/cloud-config/kind"
1010
"github.com/spf13/cobra"
1111
"github.com/spf13/pflag"
1212
"github.com/spf13/viper"
@@ -41,11 +41,11 @@ func createKind() *cobra.Command {
4141
}
4242

4343
// Parse extra port mappings from JSON string to PortMapping struct
44-
var extraPortMappings []kindCloudConfig.PortMapping
44+
var extraPortMappings []kindApi.PortMapping
4545
extraPortMappingsStr := viper.GetString(params.KindExtraPortMappings)
4646
if extraPortMappingsStr != "" {
4747
var err error
48-
extraPortMappings, err = kindCloudConfig.ParseExtraPortMappings(extraPortMappingsStr)
48+
extraPortMappings, err = kindApi.ParseExtraPortMappings(extraPortMappingsStr)
4949
if err != nil {
5050
return fmt.Errorf("failed to parse 'extra-port-mappings' flag: %w", err)
5151
}
@@ -60,7 +60,7 @@ func createKind() *cobra.Command {
6060
DebugLevel: viper.GetUint(params.DebugLevel),
6161
Tags: viper.GetStringMapString(params.Tags),
6262
},
63-
&kind.KindArgs{
63+
&kindApi.KindArgs{
6464
ComputeRequest: params.ComputeRequestArgs(),
6565
Spot: params.SpotArgs(),
6666
Version: viper.GetString(params.KindK8SVersion),
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package services
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/redhat-developer/mapt/cmd/mapt/cmd/params"
7+
maptContext "github.com/redhat-developer/mapt/pkg/manager/context"
8+
kindApi "github.com/redhat-developer/mapt/pkg/provider/api/k8s/kind"
9+
"github.com/redhat-developer/mapt/pkg/provider/azure/action/kind"
10+
"github.com/spf13/cobra"
11+
"github.com/spf13/pflag"
12+
"github.com/spf13/viper"
13+
)
14+
15+
func GetKindCmd() *cobra.Command {
16+
c := &cobra.Command{
17+
Use: params.KindCmd,
18+
Short: params.KindCmdDesc,
19+
RunE: func(cmd *cobra.Command, args []string) error {
20+
if err := viper.BindPFlags(cmd.Flags()); err != nil {
21+
return err
22+
}
23+
return nil
24+
},
25+
}
26+
flagSet := pflag.NewFlagSet(params.KindCmd, pflag.ExitOnError)
27+
params.AddCommonFlags(flagSet)
28+
c.PersistentFlags().AddFlagSet(flagSet)
29+
c.AddCommand(createKind(), destroyKind())
30+
return c
31+
32+
}
33+
34+
func createKind() *cobra.Command {
35+
c := &cobra.Command{
36+
Use: params.CreateCmdName,
37+
Short: params.CreateCmdName,
38+
RunE: func(cmd *cobra.Command, args []string) error {
39+
if err := viper.BindPFlags(cmd.Flags()); err != nil {
40+
return err
41+
}
42+
43+
// Parse extra port mappings from JSON string to PortMapping struct
44+
var extraPortMappings []kindApi.PortMapping
45+
extraPortMappingsStr := viper.GetString(params.KindExtraPortMappings)
46+
if extraPortMappingsStr != "" {
47+
var err error
48+
extraPortMappings, err = kindApi.ParseExtraPortMappings(extraPortMappingsStr)
49+
if err != nil {
50+
return fmt.Errorf("failed to parse 'extra-port-mappings' flag: %w", err)
51+
}
52+
}
53+
54+
if _, err := kind.Create(
55+
&maptContext.ContextArgs{
56+
ProjectName: viper.GetString(params.ProjectName),
57+
BackedURL: viper.GetString(params.BackedURL),
58+
ResultsOutput: viper.GetString(params.ConnectionDetailsOutput),
59+
Debug: viper.IsSet(params.Debug),
60+
DebugLevel: viper.GetUint(params.DebugLevel),
61+
Tags: viper.GetStringMapString(params.Tags),
62+
},
63+
&kindApi.KindArgs{
64+
ComputeRequest: params.ComputeRequestArgs(),
65+
Spot: params.SpotArgs(),
66+
Version: viper.GetString(params.KindK8SVersion),
67+
Arch: viper.GetString(params.LinuxArch),
68+
Timeout: viper.GetString(params.Timeout),
69+
ExtraPortMappings: extraPortMappings}); err != nil {
70+
return err
71+
}
72+
return nil
73+
},
74+
}
75+
flagSet := pflag.NewFlagSet(params.CreateCmdName, pflag.ExitOnError)
76+
flagSet.StringP(params.ConnectionDetailsOutput, "", "", params.ConnectionDetailsOutputDesc)
77+
flagSet.StringP(params.KindK8SVersion, "", "", params.KindK8SVersionDesc)
78+
flagSet.StringP(params.LinuxArch, "", params.LinuxArchDefault, params.LinuxArchDesc)
79+
flagSet.StringP(params.KindExtraPortMappings, "", "", params.KindExtraPortMappingsDesc)
80+
flagSet.StringP(params.Timeout, "", "", params.TimeoutDesc)
81+
flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc)
82+
params.AddComputeRequestFlags(flagSet)
83+
params.AddSpotFlags(flagSet)
84+
c.PersistentFlags().AddFlagSet(flagSet)
85+
return c
86+
}
87+
88+
func destroyKind() *cobra.Command {
89+
c := &cobra.Command{
90+
Use: params.DestroyCmdName,
91+
Short: params.DestroyCmdName,
92+
RunE: func(cmd *cobra.Command, args []string) error {
93+
if err := viper.BindPFlags(cmd.Flags()); err != nil {
94+
return err
95+
}
96+
return kind.Destroy(&maptContext.ContextArgs{
97+
ProjectName: viper.GetString(params.ProjectName),
98+
BackedURL: viper.GetString(params.BackedURL),
99+
Debug: viper.IsSet(params.Debug),
100+
DebugLevel: viper.GetUint(params.DebugLevel),
101+
Serverless: viper.IsSet(params.Serverless),
102+
ForceDestroy: viper.IsSet(params.ForceDestroy),
103+
})
104+
},
105+
}
106+
flagSet := pflag.NewFlagSet(params.DestroyCmdName, pflag.ExitOnError)
107+
flagSet.Bool(params.Serverless, false, params.ServerlessDesc)
108+
flagSet.Bool(params.ForceDestroy, false, params.ForceDestroyDesc)
109+
c.PersistentFlags().AddFlagSet(flagSet)
110+
return c
111+
}

pkg/provider/api/k8s/kind/kind.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package kind
2+
3+
import (
4+
cr "github.com/redhat-developer/mapt/pkg/provider/api/compute-request"
5+
spotTypes "github.com/redhat-developer/mapt/pkg/provider/api/spot"
6+
)
7+
8+
// TODO do some code to get this info from kind source code
9+
type KindK8SImages struct {
10+
KindVersion string
11+
KindImage string
12+
}
13+
14+
var KindK8sVersions map[string]KindK8SImages = map[string]KindK8SImages{
15+
"v1.33": {"v0.29.0", "kindest/node:v1.33.1@sha256:050072256b9a903bd914c0b2866828150cb229cea0efe5892e2b644d5dd3b34f"},
16+
"v1.32": {"v0.29.0", "kindest/node:v1.32.5@sha256:e3b2327e3a5ab8c76f5ece68936e4cafaa82edf58486b769727ab0b3b97a5b0d"},
17+
"v1.31": {"v0.29.0", "kindest/node:v1.31.9@sha256:b94a3a6c06198d17f59cca8c6f486236fa05e2fb359cbd75dabbfc348a10b211"},
18+
"v1.30": {"v0.29.0", "kindest/node:v1.30.13@sha256:397209b3d947d154f6641f2d0ce8d473732bd91c87d9575ade99049aa33cd648"},
19+
}
20+
21+
// TODO check if allow customize this, specially ingress related ports
22+
var (
23+
PortHTTP = 8888
24+
PortHTTPS = 9443
25+
PortAPI = 6443
26+
)
27+
28+
type KindArgs struct {
29+
Prefix string
30+
ComputeRequest *cr.ComputeRequestArgs
31+
Version string
32+
Arch string
33+
Spot *spotTypes.SpotArgs
34+
Timeout string
35+
ExtraPortMappings []PortMapping
36+
}
37+
38+
type KindResults struct {
39+
Username string `json:"username"`
40+
PrivateKey string `json:"private_key"`
41+
Host string `json:"host"`
42+
Kubeconfig string `json:"kubeconfig"`
43+
SpotPrice *float64 `json:"spot_price,omitempty"`
44+
}

pkg/provider/aws/action/kind/constants.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,6 @@ var (
2424
outputKubeconfig = "akdKubeconfig"
2525
)
2626

27-
// TODO do some code to get this info from kind source code
28-
type kindK8SImages struct {
29-
kindVersion string
30-
KindImage string
31-
}
32-
33-
var KindK8sVersions map[string]kindK8SImages = map[string]kindK8SImages{
34-
"v1.33": {"v0.29.0", "kindest/node:v1.33.1@sha256:050072256b9a903bd914c0b2866828150cb229cea0efe5892e2b644d5dd3b34f"},
35-
"v1.32": {"v0.29.0", "kindest/node:v1.32.5@sha256:e3b2327e3a5ab8c76f5ece68936e4cafaa82edf58486b769727ab0b3b97a5b0d"},
36-
"v1.31": {"v0.29.0", "kindest/node:v1.31.9@sha256:b94a3a6c06198d17f59cca8c6f486236fa05e2fb359cbd75dabbfc348a10b211"},
37-
"v1.30": {"v0.29.0", "kindest/node:v1.30.13@sha256:397209b3d947d154f6641f2d0ce8d473732bd91c87d9575ade99049aa33cd648"},
38-
}
39-
40-
// TODO check if allow customize this, specially ingress related ports
41-
var (
42-
portHTTP = 8888
43-
portHTTPS = 9443
44-
portAPI = 6443
45-
)
46-
4727
// TODO check latest stable Fedora version
4828
// for the time being we will use 41
4929
func amiName(arch *string) string { return fmt.Sprintf(amiRegex[*arch], "41") }

pkg/provider/aws/action/kind/kind.go

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import (
1111
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1212
"github.com/redhat-developer/mapt/pkg/manager"
1313
mc "github.com/redhat-developer/mapt/pkg/manager/context"
14-
cr "github.com/redhat-developer/mapt/pkg/provider/api/compute-request"
15-
spotTypes "github.com/redhat-developer/mapt/pkg/provider/api/spot"
14+
kindApi "github.com/redhat-developer/mapt/pkg/provider/api/k8s/kind"
1615
"github.com/redhat-developer/mapt/pkg/provider/aws"
1716
awsConstants "github.com/redhat-developer/mapt/pkg/provider/aws/constants"
1817
"github.com/redhat-developer/mapt/pkg/provider/aws/modules/allocation"
@@ -23,24 +22,13 @@ import (
2322
amiSVC "github.com/redhat-developer/mapt/pkg/provider/aws/services/ec2/ami"
2423
"github.com/redhat-developer/mapt/pkg/provider/aws/services/ec2/keypair"
2524
securityGroup "github.com/redhat-developer/mapt/pkg/provider/aws/services/ec2/security-group"
26-
kindCloudConfig "github.com/redhat-developer/mapt/pkg/provider/util/cloud-config/kind"
2725
"github.com/redhat-developer/mapt/pkg/provider/util/command"
2826
"github.com/redhat-developer/mapt/pkg/provider/util/output"
2927
"github.com/redhat-developer/mapt/pkg/util"
3028
"github.com/redhat-developer/mapt/pkg/util/logging"
3129
resourcesUtil "github.com/redhat-developer/mapt/pkg/util/resources"
3230
)
3331

34-
type KindArgs struct {
35-
Prefix string
36-
ComputeRequest *cr.ComputeRequestArgs
37-
Version string
38-
Arch string
39-
Spot *spotTypes.SpotArgs
40-
Timeout string
41-
ExtraPortMappings []kindCloudConfig.PortMapping
42-
}
43-
4432
type kindRequest struct {
4533
mCtx *mc.Context
4634
prefix *string
@@ -49,7 +37,7 @@ type kindRequest struct {
4937
spot bool
5038
timeout *string
5139
allocationData *allocation.AllocationResult
52-
extraPortMappings []kindCloudConfig.PortMapping
40+
extraPortMappings []kindApi.PortMapping
5341
}
5442

5543
func (r *kindRequest) validate() error {
@@ -61,18 +49,10 @@ func (r *kindRequest) validate() error {
6149
return v.Struct(r)
6250
}
6351

64-
type KindResultsMetadata struct {
65-
Username string `json:"username"`
66-
PrivateKey string `json:"private_key"`
67-
Host string `json:"host"`
68-
Kubeconfig string `json:"kubeconfig"`
69-
SpotPrice *float64 `json:"spot_price,omitempty"`
70-
}
71-
7252
// Create orchestrate 3 stacks:
7353
// If spot is enable it will run best spot option to get the best option to spin the machine
7454
// Then it will run the stack for windows dedicated host
75-
func Create(mCtxArgs *mc.ContextArgs, args *KindArgs) (kr *KindResultsMetadata, err error) {
55+
func Create(mCtxArgs *mc.ContextArgs, args *kindApi.KindArgs) (kr *kindApi.KindResults, err error) {
7656
mCtx, err := mc.Init(mCtxArgs, aws.Provider())
7757
if err != nil {
7858
return nil, err
@@ -116,7 +96,7 @@ func Destroy(mCtxArgs *mc.ContextArgs) (err error) {
11696
return nil
11797
}
11898

119-
func (r *kindRequest) createHost() (*KindResultsMetadata, error) {
99+
func (r *kindRequest) createHost() (*kindApi.KindResults, error) {
120100
cs := manager.Stack{
121101
StackName: r.mCtx.StackNameByProject(stackName),
122102
ProjectName: r.mCtx.ProjectName(),
@@ -196,7 +176,7 @@ func (r *kindRequest) deploy(ctx *pulumi.Context) error {
196176
return err
197177
}
198178
// Build LB target groups including both default and extra ports
199-
lbTargetGroups := []int{22, portAPI, portHTTP, portHTTPS}
179+
lbTargetGroups := []int{22, kindApi.PortAPI, kindApi.PortHTTP, kindApi.PortHTTPS}
200180
lbTargetGroups = append(lbTargetGroups, extraHostPorts...)
201181

202182
cr := compute.ComputeRequest{
@@ -253,7 +233,7 @@ func (r *kindRequest) deploy(ctx *pulumi.Context) error {
253233
}
254234

255235
// Write exported values in context to files o a selected target folder
256-
func (r *kindRequest) manageResults(stackResult auto.UpResult, prefix *string) (*KindResultsMetadata, error) {
236+
func (r *kindRequest) manageResults(stackResult auto.UpResult, prefix *string) (*kindApi.KindResults, error) {
257237
username, err := getResultOutput(outputUsername, stackResult, prefix)
258238
if err != nil {
259239
return nil, err
@@ -271,7 +251,7 @@ func (r *kindRequest) manageResults(stackResult auto.UpResult, prefix *string) (
271251
return nil, err
272252
}
273253

274-
metadataResults := &KindResultsMetadata{
254+
metadataResults := &kindApi.KindResults{
275255
Username: username,
276256
PrivateKey: privateKey,
277257
Host: host,
@@ -315,9 +295,9 @@ func securityGroups(ctx *pulumi.Context, mCtx *mc.Context, prefix *string,
315295
// Build ingress rules including both default and extra ports
316296
ingressRules := []securityGroup.IngressRules{
317297
securityGroup.SSH_TCP,
318-
{Description: "HTTPS", FromPort: portHTTPS, ToPort: portHTTPS, Protocol: "tcp"},
319-
{Description: "HTTP", FromPort: portHTTP, ToPort: portHTTP, Protocol: "tcp"},
320-
{Description: "API", FromPort: portAPI, ToPort: portAPI, Protocol: "tcp"},
298+
{Description: "HTTPS", FromPort: kindApi.PortHTTPS, ToPort: kindApi.PortHTTPS, Protocol: "tcp"},
299+
{Description: "HTTP", FromPort: kindApi.PortHTTP, ToPort: kindApi.PortHTTP, Protocol: "tcp"},
300+
{Description: "API", FromPort: kindApi.PortAPI, ToPort: kindApi.PortAPI, Protocol: "tcp"},
321301
}
322302

323303
// Add extra ports to ingress rules
@@ -348,16 +328,16 @@ func securityGroups(ctx *pulumi.Context, mCtx *mc.Context, prefix *string,
348328
return pulumi.StringArray(sgs[:]), nil
349329
}
350330

351-
func userData(arch, k8sVersion *string, parsedPortMappings []kindCloudConfig.PortMapping, lbEIP *pulumi.StringOutput) (pulumi.StringPtrInput, error) {
331+
func userData(arch, k8sVersion *string, parsedPortMappings []kindApi.PortMapping, lbEIP *pulumi.StringOutput) (pulumi.StringPtrInput, error) {
352332
ccB64 := lbEIP.ApplyT(
353333
func(publicIP string) (string, error) {
354-
ccB64, err := kindCloudConfig.CloudConfig(
355-
&kindCloudConfig.DataValues{
334+
ccB64, err := kindApi.CloudConfig(
335+
&kindApi.DataValues{
356336
Arch: util.If(*arch == "x86_64",
357-
kindCloudConfig.X86_64,
358-
kindCloudConfig.Arm64),
359-
KindVersion: KindK8sVersions[*k8sVersion].kindVersion,
360-
KindImage: KindK8sVersions[*k8sVersion].KindImage,
337+
kindApi.X86_64,
338+
kindApi.Arm64),
339+
KindVersion: kindApi.KindK8sVersions[*k8sVersion].KindVersion,
340+
KindImage: kindApi.KindK8sVersions[*k8sVersion].KindImage,
361341
Username: amiUserDefault,
362342
PublicIP: publicIP,
363343
ExtraPortMappings: parsedPortMappings})
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package kind
2+
3+
import (
4+
mc "github.com/redhat-developer/mapt/pkg/manager/context"
5+
kindApi "github.com/redhat-developer/mapt/pkg/provider/api/k8s/kind"
6+
azureLinux "github.com/redhat-developer/mapt/pkg/provider/azure/action/linux"
7+
"github.com/redhat-developer/mapt/pkg/provider/azure/data"
8+
"github.com/redhat-developer/mapt/pkg/provider/util/command"
9+
)
10+
11+
func Create(mCtxArgs *mc.ContextArgs, args *kindApi.KindArgs) (*kindApi.KindResults, error) {
12+
kindRequest :=
13+
&azureLinux.LinuxArgs{
14+
Prefix: args.Prefix,
15+
ComputeRequest: args.ComputeRequest,
16+
Spot: args.Spot,
17+
Version: args.Version,
18+
Arch: args.Arch,
19+
OSType: data.Fedora,
20+
// GetUserdata: kindApi.GetAsUserdata,
21+
// As RHEL now is set with cloud init this is the ReadinessCommand to check
22+
ReadinessCommand: command.CommandCloudInitWait}
23+
err := azureLinux.Create(mCtxArgs, kindRequest)
24+
if err != nil {
25+
return nil, err
26+
}
27+
return nil, nil
28+
}
29+
30+
func Destroy(ctx *mc.ContextArgs) error {
31+
return azureLinux.Destroy(ctx)
32+
}

0 commit comments

Comments
 (0)