// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package api import ( "context" "net/http" ) func (c *Sys) SealStatus() (*SealStatusResponse, error) { return c.SealStatusWithContext(context.Background()) } func (c *Sys) SealStatusWithContext(ctx context.Context) (*SealStatusResponse, error) { r := c.c.NewRequest(http.MethodGet, "/v1/sys/seal-status") return sealStatusRequestWithContext(ctx, c, r) } func (c *Sys) Seal() error { return c.SealWithContext(context.Background()) } func (c *Sys) SealWithContext(ctx context.Context) error { ctx, cancelFunc := c.c.withConfiguredTimeout(ctx) defer cancelFunc() r := c.c.NewRequest(http.MethodPut, "/v1/sys/seal") resp, err := c.c.rawRequestWithContext(ctx, r) if err != nil { return err } defer resp.Body.Close() return nil } func (c *Sys) ResetUnsealProcess() (*SealStatusResponse, error) { return c.ResetUnsealProcessWithContext(context.Background()) } func (c *Sys) ResetUnsealProcessWithContext(ctx context.Context) (*SealStatusResponse, error) { body := map[string]interface{}{"reset": true} r := c.c.NewRequest(http.MethodPut, "/v1/sys/unseal") if err := r.SetJSONBody(body); err != nil { return nil, err } return sealStatusRequestWithContext(ctx, c, r) } func (c *Sys) Unseal(shard string) (*SealStatusResponse, error) { return c.UnsealWithContext(context.Background(), shard) } func (c *Sys) UnsealWithContext(ctx context.Context, shard string) (*SealStatusResponse, error) { body := map[string]interface{}{"key": shard} r := c.c.NewRequest(http.MethodPut, "/v1/sys/unseal") if err := r.SetJSONBody(body); err != nil { return nil, err } return sealStatusRequestWithContext(ctx, c, r) } func (c *Sys) UnsealWithOptions(opts *UnsealOpts) (*SealStatusResponse, error) { return c.UnsealWithOptionsWithContext(context.Background(), opts) } func (c *Sys) UnsealWithOptionsWithContext(ctx context.Context, opts *UnsealOpts) (*SealStatusResponse, error) { r := c.c.NewRequest(http.MethodPut, "/v1/sys/unseal") if err := r.SetJSONBody(opts); err != nil { return nil, err } return sealStatusRequestWithContext(ctx, c, r) } func sealStatusRequestWithContext(ctx context.Context, c *Sys, r *Request) (*SealStatusResponse, error) { ctx, cancelFunc := c.c.withConfiguredTimeout(ctx) defer cancelFunc() resp, err := c.c.rawRequestWithContext(ctx, r) if err != nil { return nil, err } defer resp.Body.Close() var result SealStatusResponse err = resp.DecodeJSON(&result) return &result, err } type SealStatusResponse struct { Type string `json:"type"` Initialized bool `json:"initialized"` Sealed bool `json:"sealed"` T int `json:"t"` N int `json:"n"` Progress int `json:"progress"` Nonce string `json:"nonce"` Version string `json:"version"` BuildDate string `json:"build_date"` Migration bool `json:"migration"` ClusterName string `json:"cluster_name,omitempty"` ClusterID string `json:"cluster_id,omitempty"` RecoverySeal bool `json:"recovery_seal"` StorageType string `json:"storage_type,omitempty"` HCPLinkStatus string `json:"hcp_link_status,omitempty"` HCPLinkResourceID string `json:"hcp_link_resource_ID,omitempty"` Warnings []string `json:"warnings,omitempty"` } type UnsealOpts struct { Key string `json:"key"` Reset bool `json:"reset"` Migrate bool `json:"migrate"` }