Skip to content

Commit 128d1ec

Browse files
committed
[Feature] Phase 6: cluster wiring, Helm chart, operator logic, CLI, and E2E tests
Complete the NovaStor implementation with full cluster wiring: - gRPC metadata service with JSON-envelope pattern (single Execute RPC) - gRPC client wrappers for metadata and chunk services - All 7 binaries wired with real dependencies (no stubs) - Helm chart with 17 templates for full Kubernetes deployment - Operator reconcilers with real logic (StoragePool, BlockVolume, SharedFilesystem, ObjectStore) - novactl CLI with cobra (pool/volume/bucket/status commands) - NFS server upgraded to JSON-RPC protocol - CSI node with real stage/unstage, NVMe-oF initiator, volume stats - CSI controller with RWX support - S3 presigned URLs and object versioning - Adapter layers bridging S3 and filer interfaces to gRPC clients - Scrubber rate limiting, cert rotation - Zap structured logging package - 6 E2E integration tests (behind //go:build e2e tag) 237 tests passing across 25 packages.
1 parent 39cc728 commit 128d1ec

74 files changed

Lines changed: 8420 additions & 135 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/proto/metadata/metadata.pb.go

Lines changed: 197 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/proto/metadata/metadata.proto

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
syntax = "proto3";
2+
3+
package metadata;
4+
5+
option go_package = "github.com/piwi3910/novastor/api/proto/metadata";
6+
7+
// MetadataService provides gRPC access to the NovaStor metadata store.
8+
// It uses a generic request/response envelope that carries JSON-encoded
9+
// domain objects as opaque payloads. This avoids duplicating the rich Go
10+
// type definitions in protobuf and keeps the wire protocol simple.
11+
service MetadataService {
12+
// Execute performs a single metadata operation identified by the
13+
// operation field in MetadataRequest. The payload carries
14+
// JSON-encoded arguments; the response payload carries the
15+
// JSON-encoded result.
16+
rpc Execute(MetadataRequest) returns (MetadataResponse);
17+
}
18+
19+
// MetadataRequest is the envelope sent by clients for every metadata
20+
// operation.
21+
message MetadataRequest {
22+
// operation is the method name, e.g. "PutVolumeMeta",
23+
// "GetObjectMeta", "ListDirectory", etc.
24+
string operation = 1;
25+
26+
// payload is the JSON-encoded argument(s) for the operation.
27+
bytes payload = 2;
28+
}
29+
30+
// MetadataResponse is the envelope returned by the server.
31+
message MetadataResponse {
32+
// payload is the JSON-encoded result of the operation (may be empty
33+
// for void operations that only return an error).
34+
bytes payload = 1;
35+
36+
// error is non-empty when the operation failed. Clients should check
37+
// this field before attempting to unmarshal payload.
38+
string error = 2;
39+
}

api/proto/metadata/metadata_grpc.pb.go

Lines changed: 123 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha1/types.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,12 @@ type ErasureCodingSpec struct {
5959
}
6060

6161
type StoragePoolStatus struct {
62-
Phase string `json:"phase,omitempty"`
63-
NodeCount int `json:"nodeCount,omitempty"`
64-
TotalCapacity string `json:"totalCapacity,omitempty"`
65-
UsedCapacity string `json:"usedCapacity,omitempty"`
66-
Conditions []metav1.Condition `json:"conditions,omitempty"`
62+
Phase string `json:"phase,omitempty"`
63+
NodeCount int `json:"nodeCount,omitempty"`
64+
TotalCapacity string `json:"totalCapacity,omitempty"`
65+
UsedCapacity string `json:"usedCapacity,omitempty"`
66+
DataProtection string `json:"dataProtection,omitempty"`
67+
Conditions []metav1.Condition `json:"conditions,omitempty"`
6768
}
6869

6970
// +kubebuilder:object:root=true
@@ -97,6 +98,8 @@ type BlockVolumeSpec struct {
9798

9899
type BlockVolumeStatus struct {
99100
Phase string `json:"phase,omitempty"`
101+
Pool string `json:"pool,omitempty"`
102+
AccessMode string `json:"accessMode,omitempty"`
100103
NodeID string `json:"nodeID,omitempty"`
101104
ChunkCount int `json:"chunkCount,omitempty"`
102105
Conditions []metav1.Condition `json:"conditions,omitempty"`

0 commit comments

Comments
 (0)