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

Commit

Permalink
Recreate bastion when failed
Browse files Browse the repository at this point in the history
  • Loading branch information
Luke Addison committed Aug 1, 2018
1 parent 1363ec6 commit 7306c38
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ func dataSourceBastionInstance() *schema.Resource {
Type: schema.TypeString,
Required: true,
},
"instance_id": {
Type: schema.TypeString,
Optional: true,
},
"username": {
Type: schema.TypeString,
Required: true,
Expand Down
10 changes: 7 additions & 3 deletions pkg/terraform/providers/tarmak/resource_vault_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ func resourceTarmakVaultCluster() *schema.Resource {
Create: resourceTarmakVaultClusterCreate,
Read: resourceTarmakVaultClusterRead,
Delete: resourceTarmakVaultClusterDelete,
Update: resourceTarmakVaultClusterCreate,

Schema: map[string]*schema.Schema{
"internal_fqdns": {
Expand All @@ -43,6 +44,10 @@ func resourceTarmakVaultCluster() *schema.Resource {
Required: true,
ForceNew: true,
},
"bastion_status": {
Type: schema.TypeString,
Required: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
Expand All @@ -52,12 +57,10 @@ func resourceTarmakVaultCluster() *schema.Resource {
}

func resourceTarmakVaultClusterCreate(d *schema.ResourceData, meta interface{}) (err error) {

client := meta.(*rpc.Client)

vaultInternalFQDNs := []string{}

//return fmt.Errorf("DEBUG: %#v", d.Get("internal_fqdns").([]interface{})[0])

for _, internalFQDN := range d.Get("internal_fqdns").([]interface{}) {
vaultInternalFQDNs = append(vaultInternalFQDNs, internalFQDN.(string))
}
Expand Down Expand Up @@ -94,6 +97,7 @@ func resourceTarmakVaultClusterCreate(d *schema.ResourceData, meta interface{})
}

func resourceTarmakVaultClusterRead(d *schema.ResourceData, meta interface{}) (err error) {

client := meta.(*rpc.Client)

vaultInternalFQDNs := []string{}
Expand Down
28 changes: 25 additions & 3 deletions pkg/terraform/providers/tarmak/resource_vault_instance_role.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
package tarmak

import (
"fmt"
"log"
"net/rpc"

Expand All @@ -16,6 +15,7 @@ func resourceTarmakVaultInstanceRole() *schema.Resource {
Create: resourceTarmakVaultInstanceRoleCreate,
Read: resourceTarmakVaultInstanceRoleRead,
Delete: resourceTarmakVaultInstanceRoleDelete,
Update: resourceTarmakVaultInstanceRoleCreate,

Schema: map[string]*schema.Schema{
"role_name": {
Expand All @@ -41,6 +41,10 @@ func resourceTarmakVaultInstanceRole() *schema.Resource {
Required: true,
ForceNew: true,
},
"vault_status": {
Type: schema.TypeString,
Required: true,
},
"init_token": {
Type: schema.TypeString,
Computed: true,
Expand All @@ -52,6 +56,13 @@ func resourceTarmakVaultInstanceRole() *schema.Resource {
func resourceTarmakVaultInstanceRoleCreate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*rpc.Client)

vaultStatus := d.Get("vault_status").(string)
if vaultStatus != tarmakRPC.VaultStatusReady {
log.Print("vault is not ready")
d.SetId("")
return nil
}

roleName := d.Get("role_name").(string)
clusterName := d.Get("vault_cluster_name").(string)
vaultInternalFQDNs := []string{}
Expand All @@ -72,12 +83,15 @@ func resourceTarmakVaultInstanceRoleCreate(d *schema.ResourceData, meta interfac
var reply tarmakRPC.VaultInstanceRoleReply
err = client.Call(tarmakRPC.VaultInstanceRole, args, &reply)
if err != nil {
log.Printf("call to %s failed: %s", tarmakRPC.VaultInstanceRole, err)
d.SetId("")
return fmt.Errorf("call to %s failed: %s", tarmakRPC.VaultInstanceRole, err)
return nil
}

if err = d.Set("init_token", reply.InitToken); err != nil {
return fmt.Errorf("failed to set init token: %s", err)
log.Printf("failed to set init token: %s", err)
d.SetId("")
return
}

d.SetId(reply.InitToken)
Expand All @@ -88,6 +102,13 @@ func resourceTarmakVaultInstanceRoleCreate(d *schema.ResourceData, meta interfac
func resourceTarmakVaultInstanceRoleRead(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*rpc.Client)

vaultStatus := d.Get("vault_status").(string)
if vaultStatus != tarmakRPC.VaultStatusReady {
log.Printf("vault is not ready")
d.SetId("")
return nil
}

roleName := d.Get("role_name").(string)
clusterName := d.Get("vault_cluster_name").(string)
vaultInternalFQDNs := []string{}
Expand All @@ -108,6 +129,7 @@ func resourceTarmakVaultInstanceRoleRead(d *schema.ResourceData, meta interface{
var reply tarmakRPC.VaultInstanceRoleReply
err = client.Call(tarmakRPC.VaultInstanceRole, args, &reply)
if err != nil {
log.Printf("call to %s failed: %s", tarmakRPC.VaultInstanceRole, err)
d.SetId("")
return nil
}
Expand Down
59 changes: 48 additions & 11 deletions pkg/terraform/providers/tarmak/rpc/bastion_instance_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ import (
cluster "github.com/jetstack/tarmak/pkg/apis/cluster/v1alpha1"
)

const (
bastionVerifyTimeoutSeconds = 180
BastionStatusUnknown = "unknown"
BastionStatusReady = "ready"
BastionStatusDown = "down"
)

var (
BastionInstanceStatusCall = fmt.Sprintf("%s.BastionInstanceStatus", RPCName)
)
Expand All @@ -25,23 +32,53 @@ func (r *tarmakRPC) BastionInstanceStatus(args *BastionInstanceStatusArgs, resul
r.tarmak.Log().Debug("received rpc bastion status")

if r.cluster.GetState() == cluster.StateDestroy {
result.Status = "unknown"
result.Status = BastionStatusUnknown
return nil
}

var err error
for i := 1; i <= Retries; i++ {
if err = r.cluster.Environment().VerifyBastionAvailable(); err != nil {
r.tarmak.Log().Error(err)
time.Sleep(time.Second)
} else {
break
// check if bastion instance exists
instances, err := r.cluster.Environment().Provider().ListHosts(r.cluster.Environment().Hub())
if err != nil {
r.tarmak.Log().Debug("failed to list instances in hub: %s", err)
result.Status = BastionStatusUnknown
return nil
}
bastionExists := false
for _, instance := range instances {
for _, role := range instance.Roles() {
if role == cluster.InstancePoolTypeBastion {
bastionExists = true
}
}
}
if err != nil {
return fmt.Errorf("bastion instance is not ready: %s", err)
if !bastionExists {
r.tarmak.Log().Debug("bastion instance does not exist")
result.Status = BastionStatusDown
return nil
}

// verify bastion responsiveness
verifyChannel := make(chan bool)
go func() {
for {
if err := r.cluster.Environment().VerifyBastionAvailable(); err != nil {
r.tarmak.Log().Error(err)
time.Sleep(time.Second)
continue
}
verifyChannel <- true
return
}
}()

select {
case <-verifyChannel:
case <-time.After(bastionVerifyTimeoutSeconds * time.Second):
r.tarmak.Log().Debug("failed to verify bastion instance")
result.Status = BastionStatusDown
return nil
}

result.Status = "ready"
result.Status = BastionStatusReady
return nil
}
37 changes: 25 additions & 12 deletions pkg/terraform/providers/tarmak/rpc/vault_cluster_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ import (
cluster "github.com/jetstack/tarmak/pkg/apis/cluster/v1alpha1"
)

const (
VaultStatusUnknown = "unknown"
VaultStatusReady = "ready"
)

var (
VaultClusterStatusCall = fmt.Sprintf("%s.VaultClusterStatus", RPCName)
VaultClusterInitStatusCall = fmt.Sprintf("%s.VaultClusterInitStatus", RPCName)
Expand All @@ -30,7 +35,7 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
r.tarmak.Log().Debug("received rpc vault cluster status")

if r.tarmak.Cluster().GetState() == cluster.StateDestroy {
result.Status = "unknown"
result.Status = VaultStatusUnknown
return nil
}

Expand All @@ -40,14 +45,16 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
if err != nil {
err = fmt.Errorf("failed to initialise vault cluster: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}

vaultTunnel, err := vault.TunnelFromFQDNs(args.VaultInternalFQDNs, args.VaultCA)
if err != nil {
err = fmt.Errorf("failed to create vault tunnel: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}
defer vaultTunnel.Stop()

Expand All @@ -57,7 +64,8 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
if err != nil {
err = fmt.Errorf("failed to retrieve vault root token: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}

vaultClient.SetToken(vaultRootToken)
Expand All @@ -68,18 +76,19 @@ func (r *tarmakRPC) VaultClusterStatus(args *VaultClusterStatusArgs, result *Vau
if err := k.Ensure(); err != nil {
err = fmt.Errorf("vault cluster is not ready: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}

result.Status = "ready"
result.Status = VaultStatusReady
return nil
}

func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result *VaultClusterStatusReply) error {
r.tarmak.Log().Debug("received rpc vault cluster status")

if r.tarmak.Cluster().GetState() == cluster.StateDestroy {
result.Status = "unknown"
result.Status = VaultStatusUnknown
return nil
}

Expand All @@ -89,7 +98,8 @@ func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result
if err != nil {
err = fmt.Errorf("failed to create vault tunnel: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}
defer vaultTunnel.Stop()

Expand All @@ -99,7 +109,8 @@ func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result
if err != nil {
err = fmt.Errorf("failed to retrieve vault root token: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}

vaultClient.SetToken(vaultRootToken)
Expand All @@ -117,14 +128,16 @@ func (r *tarmakRPC) VaultClusterInitStatus(args *VaultClusterStatusArgs, result
if err != nil {
err = fmt.Errorf("failed to retrieve init status: %s", err)
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}
if !up {
err = fmt.Errorf("failed to initialised vault cluster")
r.tarmak.Log().Error(err)
return err
result.Status = VaultStatusUnknown
return nil
}

result.Status = "ready"
result.Status = VaultStatusReady
return nil
}
8 changes: 7 additions & 1 deletion terraform/amazon/modules/bastion/bastion.tf
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,14 @@ resource "aws_security_group" "bastion" {
}
}

data "tarmak_bastion_instance" "bastion" {
hostname = "bastion"
username = "centos"

depends_on = ["aws_instance.bastion"]
}

resource "aws_instance" "bastion" {
count = 1
ami = "${var.bastion_ami}"
instance_type = "${var.bastion_instance_type}"
subnet_id = "${var.public_subnet_ids[0]}"
Expand Down
21 changes: 4 additions & 17 deletions terraform/amazon/modules/bastion/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
output "bastion_instance_id" {
value = "${element(concat(aws_instance.bastion.*.id, list("")), 0)}"
}


output "bastion_fqdn" {
value = "${aws_route53_record.bastion.fqdn}"
}

output "bastion_private_ip" {
value = "${aws_eip.bastion.public_ip}"
}

output "bastion_ip" {
value = "${aws_eip.bastion.public_ip}"
output "bastion_status" {
value = "${data.tarmak_bastion_instance.bastion.status}"
}

output "bastion_security_group_id" {
value = "${element(concat(aws_security_group.bastion.*.id, list("")), 0)}"
}

output "remote_admin_security_group_id" {
value = "${aws_security_group.remote_admin.id}"
output "bastion_instance_id" {
value = "${element(concat(aws_instance.bastion.*.id, list("")), 0)}"
}
8 changes: 3 additions & 5 deletions terraform/amazon/modules/kubernetes/inputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ variable "internal_fqdns" {
type = "list"
}

variable "vault_kms_key_id" {}

variable "vault_unseal_key_name" {}

# template variables
variable "availability_zones" {
type = "list"
Expand All @@ -76,4 +72,6 @@ variable "public_zone_id" {}

variable "vault_security_group_id" {}

variable "bastion_security_group_id" {}
variable "bastion_security_group_id" {}

variable "vault_status" {}
Loading

0 comments on commit 7306c38

Please sign in to comment.