Fix Cluster object being returned as nil when unsealed

This commit is contained in:
vishalnayak 2016-08-10 15:09:16 -04:00
parent 6107228b8b
commit 95f9c62523
3 changed files with 54 additions and 45 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}