From a109e2a11ea46c78f235b20632f9320d8813258b Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Mon, 22 Jan 2018 21:44:38 -0500 Subject: [PATCH] Sync some bits over --- api/sys_health.go | 18 +++--- helper/consts/replication.go | 48 ++++++++++----- http/sys_health.go | 36 +++++------ http/sys_health_test.go | 60 +++++++++---------- logical/plugin/grpc_system.go | 2 +- logical/plugin/system.go | 2 +- vault/core.go | 2 + vault/logical_system.go | 2 +- vault/request_forwarding.go | 2 +- website/source/api/system/health.html.md | 18 ++++-- website/source/api/system/license.html.md | 9 +++ .../source/api/system/replication-dr.html.md | 2 +- .../system/replication-performance.html.md | 2 +- website/source/api/system/replication.html.md | 4 +- 14 files changed, 121 insertions(+), 86 deletions(-) diff --git a/api/sys_health.go b/api/sys_health.go index f2260fd8ec..82fd1f6f99 100644 --- a/api/sys_health.go +++ b/api/sys_health.go @@ -21,13 +21,13 @@ func (c *Sys) Health() (*HealthResponse, error) { } type HealthResponse struct { - Initialized bool `json:"initialized"` - Sealed bool `json:"sealed"` - Standby bool `json:"standby"` - ReplicationPerfMode string `json:"replication_perf_mode"` - ReplicationDRMode string `json:"replication_dr_mode"` - ServerTimeUTC int64 `json:"server_time_utc"` - Version string `json:"version"` - ClusterName string `json:"cluster_name,omitempty"` - ClusterID string `json:"cluster_id,omitempty"` + Initialized bool `json:"initialized"` + Sealed bool `json:"sealed"` + Standby bool `json:"standby"` + ReplicationPerformanceMode string `json:"replication_performance_mode"` + ReplicationDRMode string `json:"replication_dr_mode"` + ServerTimeUTC int64 `json:"server_time_utc"` + Version string `json:"version"` + ClusterName string `json:"cluster_name,omitempty"` + ClusterID string `json:"cluster_id,omitempty"` } diff --git a/helper/consts/replication.go b/helper/consts/replication.go index 3df5da1bec..aad7fd3e60 100644 --- a/helper/consts/replication.go +++ b/helper/consts/replication.go @@ -8,50 +8,68 @@ const ( OldReplicationSecondary OldReplicationBootstrapping - ReplicationDisabled ReplicationState = 0 + ReplicationUnknown ReplicationState = 0 ReplicationPerformancePrimary ReplicationState = 1 << iota ReplicationPerformanceSecondary - ReplicationBootstrapping + OldSplitReplicationBootstrapping ReplicationDRPrimary ReplicationDRSecondary + ReplicationPerformanceBootstrapping + ReplicationDRBootstrapping + ReplicationPerformanceDisabled + ReplicationDRDisabled ) -func (r ReplicationState) String() string { +func (r ReplicationState) string() string { switch r { case ReplicationPerformanceSecondary: - return "perf-secondary" + return "secondary" case ReplicationPerformancePrimary: - return "perf-primary" - case ReplicationBootstrapping: + return "primary" + case ReplicationPerformanceBootstrapping: return "bootstrapping" + case ReplicationPerformanceDisabled: + return "disabled" case ReplicationDRPrimary: - return "dr-primary" + return "primary" case ReplicationDRSecondary: - return "dr-secondary" + return "secondary" + case ReplicationDRBootstrapping: + return "bootstrapping" + case ReplicationDRDisabled: + return "disabled" } - return "disabled" + return "unknown" } func (r ReplicationState) GetDRString() string { switch { + case r.HasState(ReplicationDRBootstrapping): + return ReplicationDRBootstrapping.string() case r.HasState(ReplicationDRPrimary): - return ReplicationDRPrimary.String() + return ReplicationDRPrimary.string() case r.HasState(ReplicationDRSecondary): - return ReplicationDRSecondary.String() + return ReplicationDRSecondary.string() + case r.HasState(ReplicationDRDisabled): + return ReplicationDRDisabled.string() default: - return ReplicationDisabled.String() + return "unknown" } } func (r ReplicationState) GetPerformanceString() string { switch { + case r.HasState(ReplicationPerformanceBootstrapping): + return ReplicationPerformanceBootstrapping.string() case r.HasState(ReplicationPerformancePrimary): - return ReplicationPerformancePrimary.String() + return ReplicationPerformancePrimary.string() case r.HasState(ReplicationPerformanceSecondary): - return ReplicationPerformanceSecondary.String() + return ReplicationPerformanceSecondary.string() + case r.HasState(ReplicationPerformanceDisabled): + return ReplicationPerformanceDisabled.string() default: - return ReplicationDisabled.String() + return "unknown" } } diff --git a/http/sys_health.go b/http/sys_health.go index 5dd14e3da6..be67f2fa29 100644 --- a/http/sys_health.go +++ b/http/sys_health.go @@ -157,27 +157,27 @@ func getSysHealth(core *vault.Core, r *http.Request) (int, *HealthResponse, erro // Format the body body := &HealthResponse{ - Initialized: init, - Sealed: sealed, - Standby: standby, - ReplicationPerfMode: replicationState.GetPerformanceString(), - ReplicationDRMode: replicationState.GetDRString(), - ServerTimeUTC: time.Now().UTC().Unix(), - Version: version.GetVersion().VersionNumber(), - ClusterName: clusterName, - ClusterID: clusterID, + Initialized: init, + Sealed: sealed, + Standby: standby, + ReplicationPerformanceMode: replicationState.GetPerformanceString(), + ReplicationDRMode: replicationState.GetDRString(), + ServerTimeUTC: time.Now().UTC().Unix(), + Version: version.GetVersion().VersionNumber(), + ClusterName: clusterName, + ClusterID: clusterID, } return code, body, nil } type HealthResponse struct { - Initialized bool `json:"initialized"` - Sealed bool `json:"sealed"` - Standby bool `json:"standby"` - ReplicationPerfMode string `json:"replication_perf_mode"` - ReplicationDRMode string `json:"replication_dr_mode"` - ServerTimeUTC int64 `json:"server_time_utc"` - Version string `json:"version"` - ClusterName string `json:"cluster_name,omitempty"` - ClusterID string `json:"cluster_id,omitempty"` + Initialized bool `json:"initialized"` + Sealed bool `json:"sealed"` + Standby bool `json:"standby"` + ReplicationPerformanceMode string `json:"replication_performance_mode"` + ReplicationDRMode string `json:"replication_dr_mode"` + ServerTimeUTC int64 `json:"server_time_utc"` + Version string `json:"version"` + ClusterName string `json:"cluster_name,omitempty"` + ClusterID string `json:"cluster_id,omitempty"` } diff --git a/http/sys_health_test.go b/http/sys_health_test.go index 33456ed7fd..16c59b5852 100644 --- a/http/sys_health_test.go +++ b/http/sys_health_test.go @@ -24,11 +24,11 @@ func TestSysHealth_get(t *testing.T) { var actual map[string]interface{} expected := map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": false, - "sealed": true, - "standby": true, + "replication_performance_mode": consts.ReplicationUnknown.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationUnknown.GetDRString(), + "initialized": false, + "sealed": true, + "standby": true, } testResponseStatus(t, resp, 501) testResponseBody(t, resp, &actual) @@ -56,11 +56,11 @@ func TestSysHealth_get(t *testing.T) { actual = map[string]interface{}{} expected = map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": true, - "sealed": true, - "standby": true, + "replication_performance_mode": consts.ReplicationUnknown.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationUnknown.GetDRString(), + "initialized": true, + "sealed": true, + "standby": true, } testResponseStatus(t, resp, 503) testResponseBody(t, resp, &actual) @@ -92,11 +92,11 @@ func TestSysHealth_get(t *testing.T) { actual = map[string]interface{}{} expected = map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": true, - "sealed": false, - "standby": false, + "replication_performance_mode": consts.ReplicationPerformanceDisabled.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationDRDisabled.GetDRString(), + "initialized": true, + "sealed": false, + "standby": false, } testResponseStatus(t, resp, 200) testResponseBody(t, resp, &actual) @@ -134,11 +134,11 @@ func TestSysHealth_customcodes(t *testing.T) { var actual map[string]interface{} expected := map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": false, - "sealed": true, - "standby": true, + "replication_performance_mode": consts.ReplicationUnknown.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationUnknown.GetDRString(), + "initialized": false, + "sealed": true, + "standby": true, } testResponseStatus(t, resp, 581) testResponseBody(t, resp, &actual) @@ -167,11 +167,11 @@ func TestSysHealth_customcodes(t *testing.T) { actual = map[string]interface{}{} expected = map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": true, - "sealed": true, - "standby": true, + "replication_performance_mode": consts.ReplicationUnknown.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationUnknown.GetDRString(), + "initialized": true, + "sealed": true, + "standby": true, } testResponseStatus(t, resp, 523) testResponseBody(t, resp, &actual) @@ -204,11 +204,11 @@ func TestSysHealth_customcodes(t *testing.T) { actual = map[string]interface{}{} expected = map[string]interface{}{ - "replication_perf_mode": consts.ReplicationDisabled.String(), - "replication_dr_mode": consts.ReplicationDisabled.String(), - "initialized": true, - "sealed": false, - "standby": false, + "replication_performance_mode": consts.ReplicationPerformanceDisabled.GetPerformanceString(), + "replication_dr_mode": consts.ReplicationDRDisabled.GetDRString(), + "initialized": true, + "sealed": false, + "standby": false, } testResponseStatus(t, resp, 202) testResponseBody(t, resp, &actual) diff --git a/logical/plugin/grpc_system.go b/logical/plugin/grpc_system.go index 5d5aa21bf2..b7081b0d77 100644 --- a/logical/plugin/grpc_system.go +++ b/logical/plugin/grpc_system.go @@ -78,7 +78,7 @@ func (s *gRPCSystemViewClient) CachingDisabled() bool { func (s *gRPCSystemViewClient) ReplicationState() consts.ReplicationState { reply, err := s.client.ReplicationState(context.Background(), &pb.Empty{}) if err != nil { - return consts.ReplicationDisabled + return consts.ReplicationUnknown } return consts.ReplicationState(reply.State) diff --git a/logical/plugin/system.go b/logical/plugin/system.go index 1a82d39e60..97f3e0f092 100644 --- a/logical/plugin/system.go +++ b/logical/plugin/system.go @@ -79,7 +79,7 @@ func (s *SystemViewClient) ReplicationState() consts.ReplicationState { err := s.client.Call("Plugin.ReplicationState", new(interface{}), &reply) if err != nil { - return consts.ReplicationDisabled + return consts.ReplicationUnknown } return reply.ReplicationState diff --git a/vault/core.go b/vault/core.go index e52bca5bea..cf92d8862b 100644 --- a/vault/core.go +++ b/vault/core.go @@ -493,6 +493,8 @@ func NewCore(conf *CoreConfig) (*Core, error) { activeNodeReplicationState: new(uint32), } + atomic.StoreUint32(c.replicationState, uint32(consts.ReplicationDRDisabled|consts.ReplicationPerformanceDisabled)) + if conf.ClusterCipherSuites != "" { suites, err := tlsutil.ParseCiphers(conf.ClusterCipherSuites) if err != nil { diff --git a/vault/logical_system.go b/vault/logical_system.go index 42b46d7e71..b0f7522674 100644 --- a/vault/logical_system.go +++ b/vault/logical_system.go @@ -43,7 +43,7 @@ var ( var state consts.ReplicationState resp := &logical.Response{ Data: map[string]interface{}{ - "mode": state.String(), + "mode": "disabled", }, } return resp, nil diff --git a/vault/request_forwarding.go b/vault/request_forwarding.go index 33e488eb8d..550895ec9c 100644 --- a/vault/request_forwarding.go +++ b/vault/request_forwarding.go @@ -480,7 +480,7 @@ func (c *forwardingClient) startHeartbeat() { case <-c.echoContext.Done(): c.echoTicker.Stop() c.core.logger.Trace("forwarding: stopping heartbeating") - atomic.StoreUint32(c.core.activeNodeReplicationState, uint32(consts.ReplicationDisabled)) + atomic.StoreUint32(c.core.activeNodeReplicationState, uint32(consts.ReplicationUnknown)) return case <-c.echoTicker.C: tick() diff --git a/website/source/api/system/health.html.md b/website/source/api/system/health.html.md index 6ba8fc99f0..0bab141f2b 100644 --- a/website/source/api/system/health.html.md +++ b/website/source/api/system/health.html.md @@ -59,14 +59,20 @@ $ curl \ This response is only returned for a `GET` request. +Note: `replication_perf_mode` and `replication_dr_mode` reflect the state of +the active node in the cluster; if you are querying it for a standby that has +just come up, it can take a small time for the active node to inform the +standby of its status. ```json { - "cluster_id": "c9abceea-4f46-4dab-a688-5ce55f89e228", - "cluster_name": "vault-cluster-5515c810", - "version": "0.6.2", - "server_time_utc": 1469555798, - "standby": false, + "initialized": true, "sealed": false, - "initialized": true + "standby": false, + "replication_perf_mode": "disabled", + "replication_dr_mode": "disabled", + "server_time_utc": 1516639589, + "version": "0.9.1", + "cluster_name": "vault-cluster-3bd69ca2", + "cluster_id": "00af5aa8-c87d-b5fc-e82e-97cd8dfaf731" } ``` diff --git a/website/source/api/system/license.html.md b/website/source/api/system/license.html.md index e290ab43b4..4faffd4f8c 100644 --- a/website/source/api/system/license.html.md +++ b/website/source/api/system/license.html.md @@ -59,6 +59,15 @@ This endpoint is used to install a license into Vault. | :------- | :--------------------------- | :--------------------- | | `PUT` | `/sys/license` | `204 (empty body)` | +### Parameters + +- `text` `(string: )` – The text of the license. + +*DR Secondary Specific Parameters* + + - `dr_operation_token` `(string: )` - DR operation token used to authorize this request. + + ### Sample Payload ```json diff --git a/website/source/api/system/replication-dr.html.md b/website/source/api/system/replication-dr.html.md index f419c1bc43..ff10983d2f 100644 --- a/website/source/api/system/replication-dr.html.md +++ b/website/source/api/system/replication-dr.html.md @@ -35,7 +35,7 @@ primary, it will look something like: ```json { - "mode": "dr-primary", + "mode": "primary", "cluster_id": "d4095d41-3aee-8791-c421-9bc7f88f7c3e", "known_secondaries": [], "last_wal": 0, diff --git a/website/source/api/system/replication-performance.html.md b/website/source/api/system/replication-performance.html.md index bba82633cc..3536cbc444 100644 --- a/website/source/api/system/replication-performance.html.md +++ b/website/source/api/system/replication-performance.html.md @@ -35,7 +35,7 @@ primary, it will look something like: ```json { - "mode": "perf-primary", + "mode": "primary", "cluster_id": "d4095d41-3aee-8791-c421-9bc7f88f7c3e", "known_secondaries": [], "last_wal": 0, diff --git a/website/source/api/system/replication.html.md b/website/source/api/system/replication.html.md index 6fca991d1b..7874213179 100644 --- a/website/source/api/system/replication.html.md +++ b/website/source/api/system/replication.html.md @@ -99,7 +99,7 @@ primary, it will look something like: ], "last_wal": 43, "merkle_root": "86d67839f47045f7d24beb4f39b14504d15a146c", - "mode": "dr-primary", + "mode": "primary", "primary_cluster_addr": "" }, "performance": { @@ -109,7 +109,7 @@ primary, it will look something like: ], "last_wal": 43, "merkle_root": "e0531d566b23403101b0868e85b63d6774ba0ef2", - "mode": "perf-primary", + "mode": "primary", "primary_cluster_addr": "" } },