diff --git a/http/sys_health.go b/http/sys_health.go index 338392d4a..889cd3f6f 100644 --- a/http/sys_health.go +++ b/http/sys_health.go @@ -118,14 +118,9 @@ func getSysHealth(core *vault.Core, r *http.Request) (int, *HealthResponse, erro var clusterName, clusterID string if !sealed { cluster, err := core.Cluster() - - // Don't set the cluster details in the health status when Vault is sealed if err != nil { return http.StatusInternalServerError, nil, err } - if cluster == nil { - return http.StatusInternalServerError, nil, nil - } clusterName = cluster.Name clusterID = cluster.ID } diff --git a/http/sys_seal.go b/http/sys_seal.go index 7b6dde3c2..1551dc9da 100644 --- a/http/sys_seal.go +++ b/http/sys_seal.go @@ -155,16 +155,10 @@ func handleSysSealStatusRaw(core *vault.Core, w http.ResponseWriter, r *http.Req var clusterName, clusterID string if !sealed { cluster, err := core.Cluster() - - // Don't set the cluster details in the status when Vault is sealed if err != nil { respondError(w, http.StatusInternalServerError, err) return } - if cluster == nil { - respondError(w, http.StatusInternalServerError, nil) - return - } clusterName = cluster.Name clusterID = cluster.ID } diff --git a/vault/cluster.go b/vault/cluster.go index ffdbb01b6..b10604b8c 100644 --- a/vault/cluster.go +++ b/vault/cluster.go @@ -23,21 +23,23 @@ type Cluster struct { } // Cluster fetches the details of either local or global cluster based on the -// input. This method errors out when Vault is sealed. +// input. This method errors out when Vault is sealed. This function never +// returns a nil Cluster object. func (c *Core) Cluster() (*Cluster, error) { + var cluster Cluster + // Fetch the storage entry. This call fails when Vault is sealed. entry, err := c.barrier.Get(coreLocalClusterInfoPath) if err != nil { - return nil, err + return &cluster, err } if entry == nil { - return nil, nil + return &cluster, nil } // Decode the cluster information - var cluster Cluster if err = jsonutil.DecodeJSON(entry.Value, &cluster); err != nil { - return nil, fmt.Errorf("failed to decode cluster details: %v", err) + return &cluster, fmt.Errorf("failed to decode cluster details: %v", err) } // Set in config file @@ -58,42 +60,60 @@ func (c *Core) setupCluster() error { c.logger.Printf("[ERR] core: failed to get cluster details: %v", err) return err } - if cluster != nil { - // If index is already present, don't update it - return nil + + if cluster == nil { + cluster = &Cluster{} } - // If cluster name is not supplied, generate one - if c.clusterName == "" { - clusterNameBytes, err := uuid.GenerateRandomBytes(4) + var modified bool + + if cluster.Name == "" { + // If cluster name is not supplied, generate one + if c.clusterName == "" { + c.logger.Printf("[TRACE] core: cluster name not found/set, generating new") + clusterNameBytes, err := uuid.GenerateRandomBytes(4) + if err != nil { + c.logger.Printf("[ERR] core: failed to generate cluster name: %v", err) + return err + } + c.clusterName = fmt.Sprintf("vault-cluster-%08x", clusterNameBytes) + } + + cluster.Name = c.clusterName + c.logger.Printf("[DEBUG] core: cluster name set to %s", cluster.Name) + modified = true + } + + if cluster.ID == "" { + // Generate a clusterID + clusterID, err := uuid.GenerateUUID() if err != nil { - c.logger.Printf("[ERR] core: failed to generate cluster name: %v", err) + c.logger.Printf("[ERR] core: failed to generate cluster identifier: %v", err) return err } - c.clusterName = fmt.Sprintf("vault-cluster-%08x", clusterNameBytes) + cluster.ID = clusterID + c.logger.Printf("[DEBUG] core: cluster ID set to %s", cluster.ID) + modified = true } - // Generate a clusterID - clusterID, err := uuid.GenerateUUID() - if err != nil { - c.logger.Printf("[ERR] core: failed to generate cluster identifier: %v", err) - return err + if modified { + // Encode the cluster information into as a JSON string + rawCluster, err := json.Marshal(cluster) + if err != nil { + c.logger.Printf("[ERR] core: failed to encode cluster details: %v", err) + return err + } + + // Store it + err = c.barrier.Put(&Entry{ + Key: coreLocalClusterInfoPath, + Value: rawCluster, + }) + if err != nil { + c.logger.Printf("[ERR] core: failed to store cluster details: %v", err) + return err + } } - // Encode the cluster information into as a JSON string - rawCluster, err := json.Marshal(&Cluster{ - Name: c.clusterName, - ID: clusterID, - }) - if err != nil { - c.logger.Printf("[ERR] core: failed to encode cluster details: %v", err) - return err - } - - // Store it - return c.barrier.Put(&Entry{ - Key: coreLocalClusterInfoPath, - Value: rawCluster, - }) - + return nil }