Skip to content
This repository was archived by the owner on Jan 9, 2023. It is now read-only.

Commit a49d142

Browse files
author
Luke Addison
committed
Check for existance of bastion instance and don't write init token during read operation
1 parent 68ce8b9 commit a49d142

File tree

7 files changed

+150
-73
lines changed

7 files changed

+150
-73
lines changed

pkg/terraform/providers/tarmak/resource_vault_cluster.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ func resourceTarmakVaultClusterRead(d *schema.ResourceData, meta interface{}) (e
109109

110110
log.Print("[DEBUG] calling rpc vault cluster init status")
111111
var reply tarmakRPC.VaultClusterStatusReply
112-
// TODO: verify that all Ensure operations have succeeded, not just initialisation
113112
err = client.Call(tarmakRPC.VaultClusterInitStatusCall, args, &reply)
114113
if err != nil {
115114
d.SetId("")

pkg/terraform/providers/tarmak/resource_vault_instance_role.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ func resourceTarmakVaultInstanceRoleCreate(d *schema.ResourceData, meta interfac
7070

7171
log.Printf("[DEBUG] calling rpc vault instance role for role %s", roleName)
7272
var reply tarmakRPC.VaultInstanceRoleReply
73-
err = client.Call(tarmakRPC.VaultInstanceRole, args, &reply)
73+
err = client.Call(tarmakRPC.VaultInstanceRoleCreate, args, &reply)
7474
if err != nil {
7575
d.SetId("")
76-
return fmt.Errorf("call to %s failed: %s", tarmakRPC.VaultInstanceRole, err)
76+
return fmt.Errorf("call to %s failed: %s", tarmakRPC.VaultInstanceRoleCreate, err)
7777
}
7878

7979
if err = d.Set("init_token", reply.InitToken); err != nil {
@@ -106,7 +106,7 @@ func resourceTarmakVaultInstanceRoleRead(d *schema.ResourceData, meta interface{
106106

107107
log.Printf("[DEBUG] calling rpc vault instance role for role %s", roleName)
108108
var reply tarmakRPC.VaultInstanceRoleReply
109-
err = client.Call(tarmakRPC.VaultInstanceRole, args, &reply)
109+
err = client.Call(tarmakRPC.VaultInstanceRoleRead, args, &reply)
110110
if err != nil {
111111
d.SetId("")
112112
return nil

pkg/terraform/providers/tarmak/rpc/bastion_instance_status.go

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import (
88
cluster "github.com/jetstack/tarmak/pkg/apis/cluster/v1alpha1"
99
)
1010

11+
const (
12+
bastionVerifyTimeoutSeconds = 120
13+
)
14+
1115
var (
1216
BastionInstanceStatusCall = fmt.Sprintf("%s.BastionInstanceStatus", RPCName)
1317
)
@@ -29,17 +33,41 @@ func (r *tarmakRPC) BastionInstanceStatus(args *BastionInstanceStatusArgs, resul
2933
return nil
3034
}
3135

32-
var err error
33-
for i := 1; i <= Retries; i++ {
34-
if err = r.cluster.Environment().VerifyBastionAvailable(); err != nil {
35-
r.tarmak.Log().Error(err)
36-
time.Sleep(time.Second)
37-
} else {
38-
break
36+
// check if instance exists
37+
instances, err := r.cluster.Environment().Provider().ListHosts(r.cluster.Environment().Hub())
38+
if err != nil {
39+
return fmt.Errorf("failed to list instances in hub: %s", err)
40+
}
41+
bastionExists := false
42+
for _, instance := range instances {
43+
for _, role := range instance.Roles() {
44+
if role == cluster.InstancePoolTypeBastion {
45+
bastionExists = true
46+
}
3947
}
4048
}
41-
if err != nil {
42-
return fmt.Errorf("bastion instance is not ready: %s", err)
49+
if !bastionExists {
50+
return fmt.Errorf("bastion instance does not exist")
51+
}
52+
53+
// verify bastion responsiveness
54+
verifyChannel := make(chan bool)
55+
go func() {
56+
for {
57+
if err := r.cluster.Environment().VerifyBastionAvailable(); err != nil {
58+
r.tarmak.Log().Error(err)
59+
time.Sleep(time.Second)
60+
continue
61+
}
62+
verifyChannel <- true
63+
return
64+
}
65+
}()
66+
67+
select {
68+
case <-verifyChannel:
69+
case <-time.After(bastionVerifyTimeoutSeconds * time.Second):
70+
return fmt.Errorf("failed to verify bastion instance")
4371
}
4472

4573
result.Status = "ready"

pkg/terraform/providers/tarmak/rpc/rpc.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
const (
1616
ConnectorSocket = "/tmp/tarmak-connector.sock"
1717
RPCName = "Tarmak"
18-
Retries = 60
1918
)
2019

2120
type tarmakRPC struct {
@@ -38,7 +37,8 @@ type Tarmak interface {
3837
BastionInstanceStatus(*BastionInstanceStatusArgs, *BastionInstanceStatusReply) error
3938
VaultClusterStatus(*VaultClusterStatusArgs, *VaultClusterStatusReply) error
4039
VaultClusterInitStatus(*VaultClusterStatusArgs, *VaultClusterStatusReply) error
41-
VaultInstanceRole(*VaultInstanceRoleArgs, *VaultInstanceRoleReply) error
40+
VaultInstanceRoleCreate(*VaultInstanceRoleArgs, *VaultInstanceRoleReply) error
41+
VaultInstanceRoleRead(*VaultInstanceRoleArgs, *VaultInstanceRoleReply) error
4242
Ping(*PingArgs, *PingReply) error
4343
log() *logrus.Entry
4444
}

pkg/terraform/providers/tarmak/rpc/vault_cluster_status.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package rpc
33

44
import (
55
"fmt"
6-
"time"
76

87
"github.com/jetstack/vault-helper/pkg/kubernetes"
98

@@ -36,6 +35,7 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
3635

3736
vault := r.cluster.Environment().Vault()
3837

38+
// initialise and unseal vault
3939
err := vault.VerifyInitFromFQDNs(args.VaultInternalFQDNs, args.VaultCA, args.VaultKMSKeyID, args.VaultUnsealKeyName)
4040
if err != nil {
4141
err = fmt.Errorf("failed to initialise vault cluster: %s", err)
@@ -78,6 +78,7 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
7878
func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result *VaultClusterStatusReply) error {
7979
r.tarmak.Log().Debug("received rpc vault cluster status")
8080

81+
// if destroying, return with unknown state
8182
if r.tarmak.Cluster().GetState() == cluster.StateDestroy {
8283
result.Status = "unknown"
8384
return nil
@@ -93,6 +94,7 @@ func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result
9394
}
9495
defer vaultTunnel.Stop()
9596

97+
// init vault client
9698
vaultClient := vaultTunnel.VaultClient()
9799

98100
vaultRootToken, err := vault.RootToken()
@@ -104,27 +106,21 @@ func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result
104106

105107
vaultClient.SetToken(vaultRootToken)
106108

107-
up := false
108-
err = nil
109-
for i := 1; i <= Retries; i++ {
110-
up, err = vaultClient.Sys().InitStatus()
111-
if err != nil {
112-
time.Sleep(time.Second)
113-
continue
114-
}
115-
break
116-
}
109+
// retrieve vault init status
110+
up, err := vaultClient.Sys().InitStatus()
117111
if err != nil {
118112
err = fmt.Errorf("failed to retrieve init status: %s", err)
119113
r.tarmak.Log().Error(err)
120114
return err
121115
}
122116
if !up {
123-
err = fmt.Errorf("failed to initialised vault cluster")
117+
err = fmt.Errorf("vault cluster is not initialised")
124118
r.tarmak.Log().Error(err)
125119
return err
126120
}
127121

122+
// TODO: verify that all Ensure operations have succeeded, not just initialisation
123+
128124
result.Status = "ready"
129125
return nil
130126
}

pkg/terraform/providers/tarmak/rpc/vault_instance_role.go

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import (
1010
)
1111

1212
var (
13-
VaultInstanceRole = fmt.Sprintf("%s.VaultInstanceRole", RPCName)
13+
VaultInstanceRoleCreate = fmt.Sprintf("%s.VaultInstanceRoleCreate", RPCName)
14+
VaultInstanceRoleRead = fmt.Sprintf("%s.VaultInstanceRoleRead", RPCName)
1415
)
1516

1617
type VaultInstanceRoleArgs struct {
@@ -25,8 +26,8 @@ type VaultInstanceRoleReply struct {
2526
InitToken string
2627
}
2728

28-
func (r *tarmakRPC) VaultInstanceRole(args *VaultInstanceRoleArgs, result *VaultInstanceRoleReply) error {
29-
r.tarmak.Log().Debug("received rpc vault instance role")
29+
func (r *tarmakRPC) VaultInstanceRoleCreate(args *VaultInstanceRoleArgs, result *VaultInstanceRoleReply) error {
30+
r.tarmak.Log().Debug("received rpc vault instance role create")
3031

3132
if r.tarmak.Cluster().GetState() == cluster.StateDestroy {
3233
result.InitToken = ""
@@ -58,18 +59,74 @@ func (r *tarmakRPC) VaultInstanceRole(args *VaultInstanceRoleArgs, result *Vault
5859
k := kubernetes.New(vaultClient, r.tarmak.Log())
5960
k.SetClusterID(r.tarmak.Cluster().ClusterName())
6061

61-
if err := k.Ensure(); err != nil {
62-
err = fmt.Errorf("vault cluster is not ready: %s", err)
62+
initToken, err := k.NewInitToken(roleName)
63+
if err != nil {
64+
return fmt.Errorf("could not get init token for role %s: %s", roleName, err)
65+
}
66+
67+
err = initToken.Ensure()
68+
if err != nil {
69+
return fmt.Errorf("could not ensure init token for role %s: %s", roleName, err)
70+
}
71+
72+
initTokenString, err := initToken.InitToken()
73+
if err != nil {
74+
return fmt.Errorf("could not retrieve init token for role %s: %s", roleName, err)
75+
}
76+
77+
result.InitToken = initTokenString
78+
79+
r.tarmak.Log().Debug(roleName, " init token ", initTokenString)
80+
81+
return nil
82+
}
83+
84+
func (r *tarmakRPC) VaultInstanceRoleRead(args *VaultInstanceRoleArgs, result *VaultInstanceRoleReply) error {
85+
r.tarmak.Log().Debug("received rpc vault instance role read")
86+
87+
if r.tarmak.Cluster().GetState() == cluster.StateDestroy {
88+
result.InitToken = ""
89+
return nil
90+
}
91+
92+
roleName := args.RoleName
93+
94+
vault := r.cluster.Environment().Vault()
95+
vaultTunnel, err := vault.TunnelFromFQDNs(args.VaultInternalFQDNs, args.VaultCA)
96+
if err != nil {
97+
err := fmt.Errorf("failed to create vault tunnel: %s", err)
98+
r.tarmak.Log().Error(err)
99+
return err
100+
}
101+
defer vaultTunnel.Stop()
102+
103+
vaultClient := vaultTunnel.VaultClient()
104+
105+
vaultRootToken, err := vault.RootToken()
106+
if err != nil {
107+
err := fmt.Errorf("failed to retrieve root token: %s", err)
63108
r.tarmak.Log().Error(err)
64109
return err
65110
}
66111

67-
initTokens := k.InitTokens()
68-
initToken, ok := initTokens[roleName]
69-
if !ok {
112+
vaultClient.SetToken(vaultRootToken)
113+
114+
k := kubernetes.New(vaultClient, r.tarmak.Log())
115+
k.SetClusterID(r.tarmak.Cluster().ClusterName())
116+
117+
initToken, err := k.NewInitToken(roleName)
118+
if err != nil {
70119
return fmt.Errorf("could not get init token for role %s: %s", roleName, err)
71120
}
72121

73-
result.InitToken = initToken
122+
initTokenString, err := initToken.InitToken()
123+
if err != nil {
124+
return fmt.Errorf("could not retrieve init token for role %s: %s", roleName, err)
125+
}
126+
127+
result.InitToken = initTokenString
128+
129+
r.tarmak.Log().Debug(roleName, " init token ", initTokenString)
130+
74131
return nil
75132
}

vendor/github.com/jetstack/vault-helper/pkg/kubernetes/kubernetes.go

Lines changed: 34 additions & 37 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)