mirror of
https://github.com/arangodb/kube-arangodb.git
synced 2024-12-14 11:57:37 +00:00
[Feature] Topology env propagation (#806)
This commit is contained in:
parent
4254057822
commit
7d02c5f588
8 changed files with 116 additions and 7 deletions
|
@ -6,6 +6,7 @@
|
|||
- Switch ArangoDB Image Discovery process from Headless Service to Pod IP
|
||||
- Fix PVC Resize for Single servers
|
||||
- Add Topology support
|
||||
- Add ARANGODB_ZONE env to Topology Managed pods
|
||||
|
||||
## [1.2.3](https://github.com/arangodb/kube-arangodb/tree/1.2.3) (2021-09-24)
|
||||
- Update UBI Image to 8.4
|
||||
|
|
45
pkg/deployment/pod/topology.community.go
Normal file
45
pkg/deployment/pod/topology.community.go
Normal file
|
@ -0,0 +1,45 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2020 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
// +build !enterprise
|
||||
|
||||
package pod
|
||||
|
||||
import (
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces"
|
||||
core "k8s.io/api/core/v1"
|
||||
)
|
||||
|
||||
func (t topology) Args(i Input) k8sutil.OptionPairs {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t topology) Volumes(i Input) ([]core.Volume, []core.VolumeMount) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (t topology) Envs(i Input) []core.EnvVar {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t topology) Verify(i Input, cachedStatus interfaces.Inspector) error {
|
||||
return nil
|
||||
}
|
27
pkg/deployment/pod/topology.go
Normal file
27
pkg/deployment/pod/topology.go
Normal file
|
@ -0,0 +1,27 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2020 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package pod
|
||||
|
||||
func Topology() Builder {
|
||||
return topology{}
|
||||
}
|
||||
|
||||
type topology struct{}
|
|
@ -35,9 +35,7 @@ func createScaleUPMemberPlan(ctx context.Context,
|
|||
log zerolog.Logger, apiObject k8sutil.APIObject,
|
||||
spec api.DeploymentSpec, status api.DeploymentStatus,
|
||||
cachedStatus inspectorInterface.Inspector, context PlanBuilderContext) api.Plan {
|
||||
return createScaleMemberPlan(ctx, log, apiObject, spec, status, cachedStatus, context).Filter(func(a api.Action) bool {
|
||||
return a.Type == api.ActionTypeAddMember
|
||||
})
|
||||
return createScaleMemberPlan(ctx, log, apiObject, spec, status, cachedStatus, context).Filter(filterScaleUP)
|
||||
}
|
||||
|
||||
func createScaleMemberPlan(ctx context.Context,
|
||||
|
@ -50,16 +48,17 @@ func createScaleMemberPlan(ctx context.Context,
|
|||
switch spec.GetMode() {
|
||||
case api.DeploymentModeSingle:
|
||||
// Never scale down
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Single, api.ServerGroupSingle, 1).Filter(filterScaleUP)...)
|
||||
case api.DeploymentModeActiveFailover:
|
||||
// Only scale agents & singles
|
||||
if a := status.Agency; a != nil && a.Size != nil {
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Agents, api.ServerGroupAgents, int(*a.Size))...)
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Agents, api.ServerGroupAgents, int(*a.Size)).Filter(filterScaleUP)...)
|
||||
}
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Single, api.ServerGroupSingle, spec.Single.GetCount())...)
|
||||
case api.DeploymentModeCluster:
|
||||
// Scale agents, dbservers, coordinators
|
||||
if a := status.Agency; a != nil && a.Size != nil {
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Agents, api.ServerGroupAgents, int(*a.Size))...)
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Agents, api.ServerGroupAgents, int(*a.Size)).Filter(filterScaleUP)...)
|
||||
}
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.DBServers, api.ServerGroupDBServers, spec.DBServers.GetCount())...)
|
||||
plan = append(plan, createScalePlan(log, status, status.Members.Coordinators, api.ServerGroupCoordinators, spec.Coordinators.GetCount())...)
|
||||
|
@ -157,3 +156,7 @@ func createReplaceMemberPlan(ctx context.Context,
|
|||
|
||||
return plan
|
||||
}
|
||||
|
||||
func filterScaleUP(a api.Action) bool {
|
||||
return a.Type == api.ActionTypeAddMember
|
||||
}
|
||||
|
|
|
@ -362,7 +362,7 @@ func TestCreatePlanSingleScale(t *testing.T) {
|
|||
|
||||
newPlan, changed := createNormalPlan(ctx, log, depl, nil, spec, status, inspector.NewEmptyInspector(), c)
|
||||
assert.True(t, changed)
|
||||
assert.Len(t, newPlan, 0) // Single mode does not scale
|
||||
assert.Len(t, newPlan, 1)
|
||||
|
||||
// Test with 1 single member
|
||||
status.Members.Single = api.MemberStatusList{
|
||||
|
@ -375,6 +375,12 @@ func TestCreatePlanSingleScale(t *testing.T) {
|
|||
assert.True(t, changed)
|
||||
assert.Len(t, newPlan, 0) // Single mode does not scale
|
||||
|
||||
spec.Single.Count = util.NewInt(2)
|
||||
newPlan, changed = createNormalPlan(ctx, log, depl, nil, spec, status, inspector.NewEmptyInspector(), c)
|
||||
assert.True(t, changed)
|
||||
assert.Len(t, newPlan, 0) // Single mode does not scale
|
||||
|
||||
spec.Single.Count = util.NewInt(1)
|
||||
// Test with 2 single members (which should not happen) and try to scale down
|
||||
status.Members.Single = api.MemberStatusList{
|
||||
api.MemberStatus{
|
||||
|
@ -388,7 +394,7 @@ func TestCreatePlanSingleScale(t *testing.T) {
|
|||
}
|
||||
newPlan, changed = createNormalPlan(ctx, log, depl, nil, spec, status, inspector.NewEmptyInspector(), c)
|
||||
assert.True(t, changed)
|
||||
assert.Len(t, newPlan, 0) // Single mode does not scale
|
||||
assert.Len(t, newPlan, 0) // Single mode does not scale down
|
||||
}
|
||||
|
||||
// TestCreatePlanActiveFailoverScale creates a `ActiveFailover` deployment to test the creating of scaling plan.
|
||||
|
@ -664,6 +670,7 @@ func TestCreatePlan(t *testing.T) {
|
|||
},
|
||||
Helper: func(ad *api.ArangoDeployment) {
|
||||
ad.Spec.Mode = api.NewMode(api.DeploymentModeSingle)
|
||||
ad.Status.Members.Single = append(ad.Status.Members.Single, api.MemberStatus{})
|
||||
},
|
||||
ExpectedPlan: []api.Action{},
|
||||
},
|
||||
|
|
|
@ -191,6 +191,8 @@ func (a *ArangoDContainer) GetEnvs() []core.EnvVar {
|
|||
}
|
||||
}
|
||||
|
||||
envs.Add(true, pod.Topology().Envs(a.member.AsInput())...)
|
||||
|
||||
return envs.GetEnvList()
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ func containersCompare(_ api.DeploymentSpec, _ api.ServerGroup, spec, status *co
|
|||
return
|
||||
}
|
||||
}
|
||||
|
||||
func initContainersCompare(deploymentSpec api.DeploymentSpec, group api.ServerGroup, spec, status *core.PodSpec) compareFunc {
|
||||
return func(builder api.ActionBuilder) (mode Mode, plan api.Plan, err error) {
|
||||
gs := deploymentSpec.GetServerGroupSpec(group)
|
||||
|
|
23
pkg/deployment/topology/const.go
Normal file
23
pkg/deployment/topology/const.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2020 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package topology
|
||||
|
||||
var ArangoDBZone = "ARANGODB_ZONE"
|
Loading…
Reference in a new issue