-
Notifications
You must be signed in to change notification settings - Fork 2
/
deployer.go
133 lines (115 loc) · 3.2 KB
/
deployer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package deployer
import (
"fmt"
"os"
"path/filepath"
"sync"
"github.com/Priyankasaggu11929/kubetest2-deployer-demo/pkg/providers"
"github.com/Priyankasaggu11929/kubetest2-deployer-demo/pkg/providers/azureaks"
"github.com/Priyankasaggu11929/kubetest2-deployer-demo/pkg/terraform"
"github.com/Priyankasaggu11929/kubetest2-deployer-demo/pkg/utils"
"github.com/spf13/pflag"
"k8s.io/klog/v2"
"sigs.k8s.io/kubetest2/pkg/types"
)
const (
Name = "aks"
)
type deployer struct {
commonOptions types.Options
logsDir string
doInit sync.Once
tmpDir string
provider providers.Provider
}
func (d *deployer) init() error {
var err error
d.doInit.Do(func() { err = d.initialize() })
return err
}
func (d *deployer) initialize() error {
d.provider = azureaks.AzureAKSProvider
randPostFix, err := utils.RandString(6)
if err != nil {
return fmt.Errorf("failed to generate a random string, error: %v", err)
}
d.tmpDir = "k8s-cluster-" + randPostFix
return nil
}
var _ types.Deployer = &deployer{}
var (
ignoreClusterDir bool
autoApprove bool
retryOnTfFailure int
breakKubetestOnUpFail bool
)
func New(opts types.Options) (types.Deployer, *pflag.FlagSet) {
d := &deployer{
commonOptions: opts,
logsDir: filepath.Join(opts.RunDir(), "logs"),
}
return d, bindFlags(d)
}
func bindFlags(d *deployer) *pflag.FlagSet {
flags := pflag.NewFlagSet(Name, pflag.ContinueOnError)
flags.BoolVar(
&ignoreClusterDir, "ignore-cluster-dir", false, "Ignore the cluster folder if exists",
)
flags.BoolVar(
&autoApprove, "auto-approve", false, "Terraform Auto Approve",
)
flags.IntVar(
&retryOnTfFailure, "retry-on-tf-failure", 1, "Retry on Terraform Apply Failure",
)
flags.BoolVar(
&breakKubetestOnUpFail, "break-kubetest-on-upfail", false, "Breaks kubetest2 when up fails",
)
flags.MarkHidden("ignore-cluster-dir")
azureaks.AzureAKSProvider.BindFlags(flags)
return flags
}
func (d *deployer) Up() error {
if err := d.init(); err != nil {
return fmt.Errorf("up failed to init: %s", err)
}
for i := 0; i <= retryOnTfFailure; i++ {
path, err := terraform.Apply(d.tmpDir, "azureaks", autoApprove)
op, oerr := terraform.Output(d.tmpDir, "azureaks")
if err != nil {
if i == retryOnTfFailure {
fmt.Printf("terraform.Output: %s\nterraform.Output error: %v\n", op, oerr)
if !breakKubetestOnUpFail {
return fmt.Errorf("Terraform Apply failed. Error: %v\n", err)
}
klog.Infof("Terraform Apply failed. Look into it and delete the resources")
klog.Infof("terraform.Apply error: %v", err)
os.Exit(1)
}
continue
} else {
fmt.Printf("terraform.Output: %s\nterraform.Output error: %v\n", op, oerr)
fmt.Printf("Terraform State at: %s\n", path)
break
}
}
return nil
}
func (d *deployer) Down() error {
if err := d.init(); err != nil {
return fmt.Errorf("down failed to init: %s", err)
}
err := terraform.Destroy(d.tmpDir, "azureaks", autoApprove)
if err != nil {
return fmt.Errorf("terraform.Destroy failed: %v", err)
}
return nil
}
func (d *deployer) IsUp() (up bool, err error) {
panic("implement me")
}
func (d *deployer) DumpClusterLogs() error {
panic("implement me")
}
func (d *deployer) Build() error {
panic("implement me")
}