1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00

[Feature] Member endpoint (#868)

This commit is contained in:
Adam Janikowski 2021-12-28 11:14:54 +01:00 committed by GitHub
parent dba0a37557
commit 94ed3786c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 115 additions and 21 deletions

View file

@ -5,6 +5,7 @@
- Fix Core InitContainers check - Fix Core InitContainers check
- Remove unused `status.members.<group>.sidecars-specs` variable - Remove unused `status.members.<group>.sidecars-specs` variable
- Keep only recent terminations - Keep only recent terminations
- Add endpoint into member status
## [1.2.6](https://github.com/arangodb/kube-arangodb/tree/1.2.6) (2021-12-15) ## [1.2.6](https://github.com/arangodb/kube-arangodb/tree/1.2.6) (2021-12-15)
- Add ArangoBackup backoff functionality - Add ArangoBackup backoff functionality

View file

@ -53,6 +53,8 @@ type ArangoMemberPodTemplate struct {
PodSpec *core.PodTemplateSpec `json:"podSpec,omitempty"` PodSpec *core.PodTemplateSpec `json:"podSpec,omitempty"`
PodSpecChecksum string `json:"podSpecChecksum,omitempty"` PodSpecChecksum string `json:"podSpecChecksum,omitempty"`
Checksum string `json:"checksum,omitempty"` Checksum string `json:"checksum,omitempty"`
Endpoint *string `json:"endpoint,omitempty"`
} }
func (a *ArangoMemberPodTemplate) GetChecksum() string { func (a *ArangoMemberPodTemplate) GetChecksum() string {

View file

@ -27,6 +27,18 @@ import (
"time" "time"
) )
type ServerGroups []ServerGroup
func (s ServerGroups) Contains(group ServerGroup) bool {
for _, a := range s {
if a == group {
return true
}
}
return false
}
type ServerGroup int type ServerGroup int
func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { func (g *ServerGroup) UnmarshalJSON(bytes []byte) error {

View file

@ -315,6 +315,11 @@ func (in *ArangoMemberPodTemplate) DeepCopyInto(out *ArangoMemberPodTemplate) {
*out = new(corev1.PodTemplateSpec) *out = new(corev1.PodTemplateSpec)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.Endpoint != nil {
in, out := &in.Endpoint, &out.Endpoint
*out = new(string)
**out = **in
}
return return
} }
@ -2202,6 +2207,26 @@ func (in ServerGroupSpecVolumes) DeepCopy() ServerGroupSpecVolumes {
return *out return *out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in ServerGroups) DeepCopyInto(out *ServerGroups) {
{
in := &in
*out = make(ServerGroups, len(*in))
copy(*out, *in)
return
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServerGroups.
func (in ServerGroups) DeepCopy() ServerGroups {
if in == nil {
return nil
}
out := new(ServerGroups)
in.DeepCopyInto(out)
return *out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServerIDGroupSpec) DeepCopyInto(out *ServerIDGroupSpec) { func (in *ServerIDGroupSpec) DeepCopyInto(out *ServerIDGroupSpec) {
*out = *in *out = *in

View file

@ -53,6 +53,8 @@ type ArangoMemberPodTemplate struct {
PodSpec *core.PodTemplateSpec `json:"podSpec,omitempty"` PodSpec *core.PodTemplateSpec `json:"podSpec,omitempty"`
PodSpecChecksum string `json:"podSpecChecksum,omitempty"` PodSpecChecksum string `json:"podSpecChecksum,omitempty"`
Checksum string `json:"checksum,omitempty"` Checksum string `json:"checksum,omitempty"`
Endpoint *string `json:"endpoint,omitempty"`
} }
func (a *ArangoMemberPodTemplate) GetChecksum() string { func (a *ArangoMemberPodTemplate) GetChecksum() string {

View file

@ -27,6 +27,18 @@ import (
"time" "time"
) )
type ServerGroups []ServerGroup
func (s ServerGroups) Contains(group ServerGroup) bool {
for _, a := range s {
if a == group {
return true
}
}
return false
}
type ServerGroup int type ServerGroup int
func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { func (g *ServerGroup) UnmarshalJSON(bytes []byte) error {

View file

@ -315,6 +315,11 @@ func (in *ArangoMemberPodTemplate) DeepCopyInto(out *ArangoMemberPodTemplate) {
*out = new(v1.PodTemplateSpec) *out = new(v1.PodTemplateSpec)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.Endpoint != nil {
in, out := &in.Endpoint, &out.Endpoint
*out = new(string)
**out = **in
}
return return
} }
@ -2202,6 +2207,26 @@ func (in ServerGroupSpecVolumes) DeepCopy() ServerGroupSpecVolumes {
return *out return *out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in ServerGroups) DeepCopyInto(out *ServerGroups) {
{
in := &in
*out = make(ServerGroups, len(*in))
copy(*out, *in)
return
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServerGroups.
func (in ServerGroups) DeepCopy() ServerGroups {
if in == nil {
return nil
}
out := new(ServerGroups)
in.DeepCopyInto(out)
return *out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServerIDGroupSpec) DeepCopyInto(out *ServerIDGroupSpec) { func (in *ServerIDGroupSpec) DeepCopyInto(out *ServerIDGroupSpec) {
*out = *in *out = *in

View file

@ -28,6 +28,8 @@ import (
"strconv" "strconv"
"sync" "sync"
"github.com/arangodb/kube-arangodb/pkg/deployment/resources"
"github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/arangodb/go-driver/agency" "github.com/arangodb/go-driver/agency"
@ -48,16 +50,21 @@ type Cache interface {
GetAgency(ctx context.Context) (agency.Agency, error) GetAgency(ctx context.Context) (agency.Agency, error)
} }
func NewClientCache(apiObjectGetter func() *api.ArangoDeployment, factory conn.Factory) Cache { type CacheGen interface {
resources.DeploymentEndpoints
resources.DeploymentInfoGetter
}
func NewClientCache(in CacheGen, factory conn.Factory) Cache {
return &cache{ return &cache{
apiObjectGetter: apiObjectGetter, in: in,
factory: factory, factory: factory,
} }
} }
type cache struct { type cache struct {
mutex sync.Mutex mutex sync.Mutex
apiObjectGetter func() *api.ArangoDeployment in CacheGen
factory conn.Factory factory conn.Factory
} }
@ -68,7 +75,7 @@ func (cc *cache) Connection(ctx context.Context, host string) (driver.Connection
func (cc *cache) extendHost(host string) string { func (cc *cache) extendHost(host string) string {
scheme := "http" scheme := "http"
if cc.apiObjectGetter().Spec.TLS.IsSecure() { if cc.in.GetSpec().TLS.IsSecure() {
scheme = "https" scheme = "https"
} }
@ -76,9 +83,14 @@ func (cc *cache) extendHost(host string) string {
} }
func (cc *cache) getClient(group api.ServerGroup, id string) (driver.Client, error) { func (cc *cache) getClient(group api.ServerGroup, id string) (driver.Client, error) {
m, _, _ := cc.apiObjectGetter().Status.Members.ElementByID(id) m, _, _ := cc.in.GetStatusSnapshot().Members.ElementByID(id)
c, err := cc.factory.Client(cc.extendHost(m.GetEndpoint(k8sutil.CreatePodDNSName(cc.apiObjectGetter(), group.AsRole(), id)))) endpoint, err := cc.in.GenerateMemberEndpoint(group, m)
if err != nil {
return nil, err
}
c, err := cc.factory.Client(cc.extendHost(m.GetEndpoint(endpoint)))
if err != nil { if err != nil {
return nil, errors.WithStack(err) return nil, errors.WithStack(err)
} }
@ -114,7 +126,7 @@ func (cc *cache) GetAuth() conn.Auth {
} }
func (cc *cache) getDatabaseClient() (driver.Client, error) { func (cc *cache) getDatabaseClient() (driver.Client, error) {
c, err := cc.factory.Client(cc.extendHost(k8sutil.CreateDatabaseClientServiceDNSName(cc.apiObjectGetter()))) c, err := cc.factory.Client(cc.extendHost(k8sutil.CreateDatabaseClientServiceDNSName(cc.in.GetAPIObject())))
if err != nil { if err != nil {
return nil, errors.WithStack(err) return nil, errors.WithStack(err)
} }
@ -148,8 +160,13 @@ func (cc *cache) GetDatabase(ctx context.Context) (driver.Client, error) {
func (cc *cache) getAgencyClient() (agency.Agency, error) { func (cc *cache) getAgencyClient() (agency.Agency, error) {
// Not found, create a new client // Not found, create a new client
var dnsNames []string var dnsNames []string
for _, m := range cc.apiObjectGetter().Status.Members.Agents { for _, m := range cc.in.GetStatusSnapshot().Members.Agents {
dnsNames = append(dnsNames, cc.extendHost(m.GetEndpoint(k8sutil.CreatePodDNSName(cc.apiObjectGetter(), api.ServerGroupAgents.AsRole(), m.ID)))) endpoint, err := cc.in.GenerateMemberEndpoint(api.ServerGroupAgents, m)
if err != nil {
return nil, err
}
dnsNames = append(dnsNames, cc.extendHost(m.GetEndpoint(endpoint)))
} }
if len(dnsNames) == 0 { if len(dnsNames) == 0 {

View file

@ -222,7 +222,7 @@ func New(config Config, deps Dependencies, apiObject *api.ArangoDeployment) (*De
agencyCache: agency.NewCache(apiObject.Spec.Mode), agencyCache: agency.NewCache(apiObject.Spec.Mode),
} }
d.clientCache = deploymentClient.NewClientCache(d.getArangoDeployment, conn.NewFactory(d.getAuth, d.getConnConfig)) d.clientCache = deploymentClient.NewClientCache(d, conn.NewFactory(d.getAuth, d.getConnConfig))
d.status.last = *(apiObject.Status.DeepCopy()) d.status.last = *(apiObject.Status.DeepCopy())
d.reconciler = reconcile.NewReconciler(deps.Log, d) d.reconciler = reconcile.NewReconciler(deps.Log, d)
@ -628,10 +628,6 @@ func (d *Deployment) SetNumberOfServers(ctx context.Context, noCoordinators, noD
return nil return nil
} }
func (d *Deployment) getArangoDeployment() *api.ArangoDeployment {
return d.apiObject
}
func (d *Deployment) ApplyPatch(ctx context.Context, p ...patch.Item) error { func (d *Deployment) ApplyPatch(ctx context.Context, p ...patch.Item) error {
parser := patch.Patch(p) parser := patch.Patch(p)

View file

@ -492,7 +492,7 @@ func createTestDeployment(t *testing.T, config Config, arangoDeployment *api.Ara
eventCh: make(chan *deploymentEvent, deploymentEventQueueSize), eventCh: make(chan *deploymentEvent, deploymentEventQueueSize),
stopCh: make(chan struct{}), stopCh: make(chan struct{}),
} }
d.clientCache = client.NewClientCache(d.getArangoDeployment, conn.NewFactory(d.getAuth, d.getConnConfig)) d.clientCache = client.NewClientCache(d, conn.NewFactory(d.getAuth, d.getConnConfig))
cachedStatus, err := inspector.NewInspector(context.Background(), d.getKubeCli(), d.getMonitoringV1Cli(), d.getArangoCli(), d.GetNamespace()) cachedStatus, err := inspector.NewInspector(context.Background(), d.getKubeCli(), d.getMonitoringV1Cli(), d.getArangoCli(), d.GetNamespace())
require.NoError(t, err) require.NoError(t, err)

View file

@ -25,8 +25,6 @@ package reconcile
import ( import (
"context" "context"
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
"github.com/arangodb/kube-arangodb/pkg/deployment/resources" "github.com/arangodb/kube-arangodb/pkg/deployment/resources"
"github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -82,7 +80,7 @@ func (a *actionArangoMemberUpdatePodSpec) Start(ctx context.Context) (bool, erro
return false, err return false, err
} }
endpoint, err := pod.GenerateMemberEndpoint(a.actionCtx.GetCachedStatus(), a.actionCtx.GetAPIObject(), spec, a.action.Group, m) endpoint, err := a.actionCtx.GenerateMemberEndpoint(a.action.Group, m)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Unable to render endpoint") log.Error().Err(err).Msg("Unable to render endpoint")
return false, err return false, err
@ -90,7 +88,6 @@ func (a *actionArangoMemberUpdatePodSpec) Start(ctx context.Context) (bool, erro
if m.Endpoint == nil || *m.Endpoint != endpoint { if m.Endpoint == nil || *m.Endpoint != endpoint {
// Update endpoint // Update endpoint
m.Endpoint = &endpoint
if err := status.Members.Update(m, a.action.Group); err != nil { if err := status.Members.Update(m, a.action.Group); err != nil {
log.Error().Err(err).Msg("Unable to update endpoint") log.Error().Err(err).Msg("Unable to update endpoint")
return false, err return false, err
@ -127,6 +124,11 @@ func (a *actionArangoMemberUpdatePodSpec) Start(ctx context.Context) (bool, erro
return false, err return false, err
} }
if z := m.Endpoint; z != nil {
q := *z
template.Endpoint = &q
}
if err := a.actionCtx.WithArangoMemberUpdate(context.Background(), member.GetNamespace(), member.GetName(), func(member *api.ArangoMember) bool { if err := a.actionCtx.WithArangoMemberUpdate(context.Background(), member.GetNamespace(), member.GetName(), func(member *api.ArangoMember) bool {
if !member.Spec.Template.Equals(template) { if !member.Spec.Template.Equals(template) {
member.Spec.Template = template.DeepCopy() member.Spec.Template = template.DeepCopy()