Fix Cluster object being returned as nil when unsealed
This commit is contained in:
parent
6107228b8b
commit
95f9c62523
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue