Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions examples/psmdb/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@ generate-openapi: openapi-gen ## Generate OpenAPI definitions for custom spec ty
--go-header-file ../../hack/boilerplate.go.txt \
github.com/openeverest/provider-sdk/examples/psmdb/types

## Optional test directory name for running subset of integration tests
TEST ?=

.PHONY: test-integration
test-integration: ## Run integration tests against K8S cluster
. ./test/vars.sh && kubectl kuttl test --config ./test/integration/kuttl.yaml
test-integration: ## Run integration tests. Usage: make test-integration TEST=<test-name>
. ./test/vars.sh && kubectl kuttl test --config ./test/integration/kuttl.yaml $(if $(TEST),--test $(TEST))

.PHONY: openapi-gen
openapi-gen: $(OPENAPI_GEN) ## Download openapi-gen locally if necessary
Expand Down
2 changes: 1 addition & 1 deletion examples/psmdb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ examples/psmdb/

3. Install the PSMDB operator:
```bash
kubectl apply --server-side -f https://raw.githubusercontent.com/percona/percona-server-mongodb-operator/v1.21.1/deploy/bundle.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/percona/percona-server-mongodb-operator/v1.21.1/deploy/cw-bundle.yaml
```

**Note:** This is a PoC requirement. In production, the underlying database operator (PSMDB in this case) should be packaged within the provider's Helm chart to ensure it installs automatically with the provider.
Expand Down
48 changes: 48 additions & 0 deletions examples/psmdb/datastore-split-horizon.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: split-horizon-config
namespace: default
data:
baseDomainNameSuffix: mydomain.com
secretName: split-horizon-secret
---
apiVersion: v1
kind: Secret
metadata:
name: split-horizon-secret
namespace: default
type: Opaque
data:
ca.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdmJZczVCa2xqSHRKckZkOFNnc0xhNzZvQ1FVQWdTcU1OdkZKVWxMSjBtMlM4eDI1ClZHWGFPWDM5Q1hHKzIxTzg5VGRoWHRRSU5nMEoxbTdmSlVFMDVGS2xKVTBPUWxRV2hETDNKWFF6UUdJc0FZV1YKV3Rib1VybjJvZVNoWHJmYkhOR3J4YnlmRitkcEJPRlpLY0pwU3Nta0ROMjVIVjlXbHdqdHFEVi9qZW92UHMvbgpPUm9VS0RJRjlSRUVwemtkbVNSbjlBNlBPb1A1UlJ6VkYzWTNlQ3JEK0RRbnQ3Qm5ndEtnWGZqbUg0RDJtSHZmCnBtWWJ0T3pjRzhNRXpBNGZaMldib2o3QlUxYTdZUmxiOVBGN1N1b1hBdldRMUJxNHlmWDN2em1KcjQ5RWZtRWoKbW4xZjdSeFdqV2M2QmxXaUFsVzFqeWJOc2VoZXl3MS9LSjk3V1FJREFRQUJBb0lCQUJZVzI1YUNGcEVMVEc1aQpuK1JUc2FSZHBsMXBmWS9zb3plbEErVnY0aFBNUWlWb2J6dEVZa0xhT0grMFpMV1BSQ1BWeTFMQ004UU9ZOWc1CjMrWHJ1Q1BET3pzekJBOWxVTnRhLzFPM09sMzdhRllUaHFyVmRlYm5CQkNBNldpNDFleWV2Y1pZQW5yRExVTmUKRlZhVFRsVUEwa2NVdkpDTzJLdGNwT1oyZHpnUDZpQ3BiUmNPUGVieDdHZXNiS2ZaRkxSOUNUSlgvUXY0YUFvMQpvL3BLYTZEeXk4V0MzNWtxOWQ3cTk4dmV1T3VMSWxPZ0k3UGdYMVBxUHJIOCs1OEI2YUduaC9Oa1VWMkd6OExKCkNSQmZoZW5RQ2EyVkM5UU9qLzhsbEVWdERTMXlNUEFUcG14ZWRESjI4ODNtWjRxNllaUjM3T0VVTVdUSWtzUWgKY0RNZUNlRUNnWUVBL0FSbldZUzFhYjQxeDVtcVlmbnhXMktvQmxvTm5LbWZGa1IvZEVqWE1ReEc3eFFSSTBNTAovenRHcUxxUHlaRGVNVGQ3ZzZVOHVmWWVPMURMQ3RjK3JwRlFVSWt1aHdxUEpVRVNiRUhMYzcvSkF5czREaUcvClVPWEJRd21RQmdlazVFaW9IaHhCNWQyWE4xTk5iemFnOFZsZkF4WDhlQnhFejFZa2RFZ0NQT0VDZ1lFQXdMV3oKRFFMaFNndW5pQjhZaXFmalQyaldZREF1NHY0ays5L1Izc1BkTm9xOVpCRk16VWE3N25pWFFOTUpFaVg5V2I2SQp2ZDBBdTAzdzdFYTNmbDIycWtmWHljQ1ZsYWxXVXJ5VjFyamxHS013VytEeEVHbUpYRWtEek1ycnRINU8xS0VCCmpFRWtPTC92Wkl6Z245UHNRSHNXTWdTbXFONDNmUCtjamdLYVZYa0NnWUJMRWZ5L083cldidVNTT29INGdYMlYKM1VOejhPdFJHVzNjTWpkTktrMS92TXA4ZVJ2Snh6VVJxRlNaK2tqT29DcXZ1bmsrYzhBdEhOVlFrZmFKbWloLwowNlY2K0FJMkU3MGtPY2dGRzJ4QlpJVzZQZXVLdWg3Rk9FdGpicnZLTUFpOFA3QmtsOEpCZU1xTW5uSFlpUXRVCkdXMGwvQ3lpa3Jra2tlSjJDT1V4d1FLQmdFUVVyUkh1cjRyS1BVQ1F3OG5RY0RUUXM5TzlrZ0x0aUVGWG5EeFgKOCtIZDkvVFBTOVBGcG9Va0kwTnFpdXpYY1A3d21qeUJSRTNueGpLaTlSWjJveDdiVExmaENyZVo0SDVRVTV0TgpMTnFjWkd4Qk5zajJqK21EZmcwdXIwRFAwcWU1emVNdjdFMEVPZDNMQzF4THNVNUNiZC96MXJFWCtJQjNpV1orCk11bjVBb0dCQUsyV3E0dFlOeWxQZVpiK2RiWWRUSmlPTkswYVdmZEs1WkpxSXdmcXNhb2xPdUIyVnhvVDVoWGkKQml4YWYwWFlPL3JlVUd1SjR5dXNQRzNOZEdEZ1h5cHFoWFU3Z2xRSmQ4SUMxMDh5elVPQjNOZy8xRGtkRjYrdwpPUWdLdmpvUXVaWDc0bkdUWG1lL3ZDSVhQRjB3Sy9IaFhhemZyWlIzMjc2VDkwQkUzdndECi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lVWTlLTWtlTC82RVhQaitWTjQ0N0hvWUY1TlpVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0lqRU9NQXdHQTFVRUNoTUZVRk5OUkVJeEVEQU9CZ05WQkFNVEIxSnZiM1FnUTBFd0hoY05NalV4TVRBMQpNRGMxTmpBd1doY05NekF4TVRBME1EYzFOakF3V2pBaU1RNHdEQVlEVlFRS0V3VlFVMDFFUWpFUU1BNEdBMVVFCkF4TUhVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwyMkxPUVoKSll4N1NheFhmRW9MQzJ1K3FBa0ZBSUVxakRieFNWSlN5ZEp0a3ZNZHVWUmwyamw5L1FseHZ0dFR2UFUzWVY3VQpDRFlOQ2RadTN5VkJOT1JTcFNWTkRrSlVGb1F5OXlWME0wQmlMQUdGbFZyVzZGSzU5cUhrb1Y2MzJ4elJxOFc4Cm54Zm5hUVRoV1NuQ2FVckpwQXpkdVIxZlZwY0k3YWcxZjQzcUx6N1A1emthRkNneUJmVVJCS2M1SFpra1ovUU8KanpxRCtVVWMxUmQyTjNncXcvZzBKN2V3WjRMU29GMzQ1aCtBOXBoNzM2Wm1HN1RzM0J2REJNd09IMmRsbTZJKwp3Vk5XdTJFWlcvVHhlMHJxRndMMWtOUWF1TW4xOTc4NWlhK1BSSDVoSTVwOVgrMGNWbzFuT2daVm9nSlZ0WThtCnpiSG9Yc3NOZnlpZmUxa0NBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGRzVXeWtBb2d0OG1hNzRTeXRxeXhxTS9TMm1NTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQ2pmeU5oaDF2cjN3MVZXalRLajl4bUNrMU9YK1pBcVI3NkpkWkk0UHhnQ1hRQkNid1d6enBLCmtmeEFTTUowNE5LYnJFZ0tnWXczNG96clNvbVlMZndETm82czlLenBBZEQ2Z2F3Q0dPZXEzNzM4T3BSSU44YTkKNENZM0ZMRCs4emExcVI0ZkVtV1dOdnFvNlBNeDE3VGVjK092WnhJcTRXakZlRDRnZ3pYeWhqMTZzSGE2Z2YyYQphbjZvbktVVnhsYTdtTGdhY2taRzNXOTdOMlNBcXR3U252d3luYXNvaWFSeEM4OTRweC9FbnpNeXcwMElqeEFkCjZGMndWYVpqWmhBRDlRMkdIV29iS0RWK05LUDYxaXVWQjA4NVJZWWxVTXBxd3J4bkhBWllJQjk4SXJmVjFyRlUKQUhQOWRFNnVqMnFvTDQyWE5rN0ZvamJJRmw4RWIyRXQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=

---
# Example 1: DataStore with Split Horizon DNS Configuration at Component Level
apiVersion: everest.percona.com/v2alpha1
kind: DataStore
metadata:
name: psmdb-split-horizon
namespace: default
spec:
provider: psmdb
components:
engine:
type: mongod
version: 8.0.8-3
replicas: 3
storage:
size: 10Gi
customSpec:
splitHorizonDNSRef:
name: split-horizon-config
backupAgent:
type: backup
replicas: 1
proxy:
type: mongos
version: 8.0.8-3
replicas: 3
# service:
# exposeType: ExternalName
36 changes: 32 additions & 4 deletions examples/psmdb/internal/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ const (
defaultBackupStartingTimeout = 120
)

const (
topologySharded = "sharded"
)

var maxUnavailable = intstr.FromInt(1)

func defaultSpec() psmdbv1.PerconaServerMongoDBSpec {
Expand Down Expand Up @@ -163,7 +167,7 @@ func configureReplsets(c *sdk.Context) []*psmdbv1.ReplsetSpec {
engine := spec.Components[ComponentEngine]

// TODO: implement disabling
if spec.Topology == nil || spec.Topology.Type != "sharded" {
if spec.Topology == nil || spec.Topology.Type != topologySharded {
return []*psmdbv1.ReplsetSpec{
configureReplset(rsName(0), engine.Replicas, engine.Resources, engine.Storage, true),
}
Expand Down Expand Up @@ -191,7 +195,7 @@ func configureConfigServerReplset(c *sdk.Context) *psmdbv1.ReplsetSpec {
cfgSrv := spec.Components[ComponentConfigServer]

// TODO: implement disabling
if spec.Topology == nil || spec.Topology.Type != "sharded" {
if spec.Topology == nil || spec.Topology.Type != topologySharded {
return replset
}

Expand Down Expand Up @@ -292,7 +296,7 @@ func SyncPSMDB(c *sdk.Context) error {
psmdb.Spec.ImagePullPolicy = corev1.PullIfNotPresent

psmdb.Spec.Replsets = configureReplsets(c)
if c.DB().Spec.Topology != nil && c.DB().Spec.Topology.Type == "sharded" {
if c.DB().Spec.Topology != nil && c.DB().Spec.Topology.Type == topologySharded {
psmdb.Spec.Sharding.Enabled = true
psmdb.Spec.Sharding.ConfigsvrReplSet = configureConfigServerReplset(c)
psmdb.Spec.Sharding.Mongos = configureMongos(c)
Expand All @@ -306,6 +310,17 @@ func SyncPSMDB(c *sdk.Context) error {
SSLInternal: c.Name() + "-ssl-internal",
}

splitHorizonRef, err := getSpritHorizonFromCustomSpec(c)
if err != nil {
return fmt.Errorf("failed to retrieve split horizon ref: %w", err)
}

if splitHorizonRef != nil {
if err := configureSplitHorizon(c, psmdb, splitHorizonRef); err != nil {
return fmt.Errorf("failed to apply split horizon configuration to PSMDB: %w", err)
}
}

if err := c.Apply(psmdb); err != nil {
return err
}
Expand All @@ -326,6 +341,19 @@ func StatusPSMDB(c *sdk.Context) (sdk.Status, error) {
}
switch psmdb.Status.State {
case psmdbv1.AppStateReady:
// Check if split horizon DNS is configured and ready
splitHorizonRef, err := getSpritHorizonFromCustomSpec(c)
if err != nil {
return sdk.Failed(err.Error()), nil
}

if splitHorizonRef != nil {
// Split horizon is configured, check if it's ready
if err := statusSplitHorizon(c, psmdb); err != nil {
return sdk.Creating("Waiting for split horizon DNS to be ready"), nil
}
}

return sdk.Running(), nil
case psmdbv1.AppStateError:
return sdk.Failed(psmdb.Status.Message), nil
Expand Down Expand Up @@ -406,7 +434,7 @@ func PSMDBMetadata() *sdk.ProviderMetadata {
// backup is the backup agent component
ComponentTypeBackup: {
Versions: []sdk.ComponentVersionMeta{
{Version: "2.9.1", Image: "percona/percona-server-mongodb-backup:2.9.1", Default: true},
{Version: "2.9.1", Image: "percona/percona-backup-mongodb:2.9.1", Default: true},
},
},
// pmm is the Percona Monitoring and Management component
Expand Down
Loading