Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ReplicatedMap CR #394

Merged
merged 4 commits into from Oct 25, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -152,7 +152,7 @@ test-it-focus: manifests generate fmt vet ## Run tests.
test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.8.3/hack/setup-envtest.sh
source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); PHONE_HOME_ENABLED=$(PHONE_HOME_ENABLED) DEVELOPER_MODE_ENABLED=$(DEVELOPER_MODE_ENABLED) go test -tags $(GO_BUILD_TAGS) -v ./test/integration/... -coverprofile cover.out $(GO_TEST_FLAGS) -timeout 5m

E2E_TEST_SUITE ?= hz || mc || hz_persistence || hz_expose_externally || map || map_persistence || hz_wan || custom_class || multimap || topic
E2E_TEST_SUITE ?= hz || mc || hz_persistence || hz_expose_externally || map || map_persistence || hz_wan || custom_class || multimap || topic || replicatedmap
ifeq (,$(E2E_TEST_SUITE))
E2E_TEST_LABELS =
else
Expand Down
8 changes: 8 additions & 0 deletions PROJECT
Expand Up @@ -61,4 +61,12 @@ resources:
kind: Topic
path: github.com/hazelcast/hazelcast-platform-operator/api/v1alpha1
version: v1alpha1
- api:
crdVersion: v1
namespaced: true
controller: true
domain: hazelcast.com
kind: ReplicatedMap
path: github.com/hazelcast/hazelcast-platform-operator/api/v1alpha1
version: v1alpha1
version: "3"
2 changes: 1 addition & 1 deletion Tiltfile
Expand Up @@ -57,7 +57,7 @@ cmd_button('Undeploy operator',
)

cmd_button('Delete CRs and PVCs',
argv=['sh', '-c', '(kubectl delete $(kubectl get wanreplication,hotbackup,map,multimap,topic,hazelcast,managementcenter -o name) 2> /dev/null || echo "No CRs" ) && kubectl delete pvc -l "app.kubernetes.io/managed-by=hazelcast-platform-operator"'],
argv=['sh', '-c', '(kubectl delete $(kubectl get wanreplication,hotbackup,map,multimap,topic,replicatedmap,hazelcast,managementcenter -o name) 2> /dev/null || echo "No CRs" ) && kubectl delete pvc -l "app.kubernetes.io/managed-by=hazelcast-platform-operator"'],
resource='hazelcast-platform-controller-manager',
location=location.RESOURCE,
icon_name='delete',
Expand Down
9 changes: 9 additions & 0 deletions api/v1alpha1/cronhotbackup_types.go
Expand Up @@ -2,6 +2,7 @@ package v1alpha1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// CronHotBackupSpec defines the desired state of CronHotBackup
Expand Down Expand Up @@ -76,6 +77,14 @@ type CronHotBackupList struct {
Items []CronHotBackup `json:"items"`
}

func (chbl *CronHotBackupList) GetItems() []client.Object {
l := make([]client.Object, 0, len(chbl.Items))
for _, item := range chbl.Items {
l = append(l, client.Object(&item))
}
return l
}

func init() {
SchemeBuilder.Register(&CronHotBackup{}, &CronHotBackupList{})
}
13 changes: 12 additions & 1 deletion api/v1alpha1/hotbackup_types.go
@@ -1,6 +1,9 @@
package v1alpha1

import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

type HotBackupState string

Expand Down Expand Up @@ -68,6 +71,14 @@ type HotBackupList struct {
Items []HotBackup `json:"items"`
}

func (hbl *HotBackupList) GetItems() []client.Object {
l := make([]client.Object, 0, len(hbl.Items))
for _, item := range hbl.Items {
l = append(l, client.Object(&item))
}
return l
}

func init() {
SchemeBuilder.Register(&HotBackup{}, &HotBackupList{})
}
9 changes: 9 additions & 0 deletions api/v1alpha1/map_types.go
Expand Up @@ -2,6 +2,7 @@ package v1alpha1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// MapSpec defines the desired state of Hazelcast Map Config
Expand Down Expand Up @@ -289,6 +290,14 @@ type MapList struct {
Items []Map `json:"items"`
}

func (ml *MapList) GetItems() []client.Object {
l := make([]client.Object, 0, len(ml.Items))
for _, item := range ml.Items {
l = append(l, client.Object(&item))
}
return l
}

func init() {
SchemeBuilder.Register(&Map{}, &MapList{})
}
Expand Down
70 changes: 59 additions & 11 deletions api/v1alpha1/multimap_types.go
@@ -1,7 +1,10 @@
package v1alpha1

import (
"encoding/json"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// MultiMapSpec defines the desired state of MultiMap
Expand Down Expand Up @@ -43,21 +46,21 @@ const (

// MultiMapStatus defines the observed state of MultiMap
type MultiMapStatus struct {
State MultiMapConfigState `json:"state,omitempty"`
Message string `json:"message,omitempty"`
MemberStatuses map[string]MultiMapConfigState `json:"memberStatuses,omitempty"`
State DataStructureConfigState `json:"state,omitempty"`
Message string `json:"message,omitempty"`
MemberStatuses map[string]DataStructureConfigState `json:"memberStatuses,omitempty"`
}

// +kubebuilder:validation:Enum=Success;Failed;Pending;Persisting;Terminating
type MultiMapConfigState string
type DataStructureConfigState string

const (
MultiMapFailed MultiMapConfigState = "Failed"
MultiMapSuccess MultiMapConfigState = "Success"
MultiMapPending MultiMapConfigState = "Pending"
// MultiMap config is added into all members but waiting for multiMap to be persisten into ConfigMap
MultiMapPersisting MultiMapConfigState = "Persisting"
MultiMapTerminating MultiMapConfigState = "Terminating"
DataStructureFailed DataStructureConfigState = "Failed"
DataStructureSuccess DataStructureConfigState = "Success"
DataStructurePending DataStructureConfigState = "Pending"
// The config is added into all members but waiting for the config to be persisten into ConfigMap
DataStructurePersisting DataStructureConfigState = "Persisting"
DataStructureTerminating DataStructureConfigState = "Terminating"
)

//+kubebuilder:object:root=true
Expand All @@ -75,13 +78,50 @@ type MultiMap struct {
Status MultiMapStatus `json:"status,omitempty"`
}

func (mm *MultiMap) MultiMapName() string {
func (mm *MultiMap) GetDSName() string {
if mm.Spec.Name != "" {
return mm.Spec.Name
}
return mm.Name
}

func (mm *MultiMap) GetKind() string {
return mm.Kind
}

func (mm *MultiMap) GetHZResourceName() string {
return mm.Spec.HazelcastResourceName
}

func (mm *MultiMap) GetStatus() DataStructureConfigState {
return mm.Status.State
}

func (mm *MultiMap) GetMemberStatuses() map[string]DataStructureConfigState {
return mm.Status.MemberStatuses
}

func (mm *MultiMap) SetStatus(status DataStructureConfigState, msg string, memberStatues map[string]DataStructureConfigState) {
mm.Status.State = status
mm.Status.Message = msg
mm.Status.MemberStatuses = memberStatues
}

func (mm *MultiMap) GetSpec() (string, error) {
mms, err := json.Marshal(mm.Spec)
if err != nil {
return "", fmt.Errorf("error marshaling %v as JSON: %w", mm.Kind, err)
}
return string(mms), nil
}

func (mm *MultiMap) SetSpec(spec string) error {
if err := json.Unmarshal([]byte(spec), &mm.Spec); err != nil {
return err
}
return nil
}

//+kubebuilder:object:root=true

// MultiMapList contains a list of MultiMap
Expand All @@ -91,6 +131,14 @@ type MultiMapList struct {
Items []MultiMap `json:"items"`
}

func (mml *MultiMapList) GetItems() []client.Object {
l := make([]client.Object, 0, len(mml.Items))
for _, item := range mml.Items {
l = append(l, &item)
}
return l
}

func init() {
SchemeBuilder.Register(&MultiMap{}, &MultiMapList{})
}
116 changes: 116 additions & 0 deletions api/v1alpha1/replicatedmap_types.go
@@ -0,0 +1,116 @@
package v1alpha1

import (
"encoding/json"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// ReplicatedMapSpec defines the desired state of ReplicatedMap
type ReplicatedMapSpec struct {
// Name of the ReplicatedMap config to be created. If empty, CR name will be used.
// +optional
Name string `json:"name,omitempty"`

// AsyncFillup specifies whether the ReplicatedMap is available for reads before the initial replication is completed
// +kubebuilder:default:=true
// +optional
AsyncFillup bool `json:"asyncFillup,omitempty"`

// InMemoryFormat specifies in which format data will be stored in the ReplicatedMap
// +kubebuilder:default:=OBJECT
// +optional
InMemoryFormat InMemoryFormatType `json:"inMemoryFormat,omitempty"`

// HazelcastResourceName defines the name of the Hazelcast resource.
// +kubebuilder:validation:MinLength:=1
HazelcastResourceName string `json:"hazelcastResourceName"`
}

// ReplicatedMapStatus defines the observed state of ReplicatedMap
type ReplicatedMapStatus struct {
State DataStructureConfigState `json:"state,omitempty"`
Message string `json:"message,omitempty"`
MemberStatuses map[string]DataStructureConfigState `json:"memberStatuses,omitempty"`
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// ReplicatedMap is the Schema for the replicatedmaps API
// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.state",description="Current state of the ReplicatedMap Config"
// +kubebuilder:printcolumn:name="Message",type="string",priority=1,JSONPath=".status.message",description="Message for the current ReplicatedMap Config"
// +kubebuilder:resource:shortName=rmap
type ReplicatedMap struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec ReplicatedMapSpec `json:"spec,omitempty"`
Status ReplicatedMapStatus `json:"status,omitempty"`
}

func (mm *ReplicatedMap) GetDSName() string {
if mm.Spec.Name != "" {
return mm.Spec.Name
}
return mm.Name
}

func (mm *ReplicatedMap) GetKind() string {
return mm.Kind
}

func (mm *ReplicatedMap) GetHZResourceName() string {
return mm.Spec.HazelcastResourceName
}

func (mm *ReplicatedMap) GetStatus() DataStructureConfigState {
return mm.Status.State
}

func (mm *ReplicatedMap) GetMemberStatuses() map[string]DataStructureConfigState {
return mm.Status.MemberStatuses
}

func (mm *ReplicatedMap) SetStatus(status DataStructureConfigState, msg string, memberStatues map[string]DataStructureConfigState) {
mm.Status.State = status
mm.Status.Message = msg
mm.Status.MemberStatuses = memberStatues
}

func (mm *ReplicatedMap) GetSpec() (string, error) {
mms, err := json.Marshal(mm.Spec)
if err != nil {
return "", fmt.Errorf("error marshaling %v as JSON: %w", mm.Kind, err)
}
return string(mms), nil
}

func (mm *ReplicatedMap) SetSpec(spec string) error {
if err := json.Unmarshal([]byte(spec), &mm.Spec); err != nil {
return err
}
return nil
}

//+kubebuilder:object:root=true

// ReplicatedMapList contains a list of ReplicatedMap
type ReplicatedMapList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ReplicatedMap `json:"items"`
}

func (rml *ReplicatedMapList) GetItems() []client.Object {
l := make([]client.Object, 0, len(rml.Items))
for _, item := range rml.Items {
l = append(l, client.Object(&item))
}
return l
}

func init() {
SchemeBuilder.Register(&ReplicatedMap{}, &ReplicatedMapList{})
}