Skip to content

Commit 83031ff

Browse files
author
jmccormick2001
committed
first part of adding --node-label command flag to pgo create cluster command, this replaces the older --node-name command flag...
1 parent 4b43421 commit 83031ff

File tree

8 files changed

+62
-78
lines changed

8 files changed

+62
-78
lines changed

apiserver/clusterservice/clusterimpl.go

Lines changed: 25 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func getPods(cluster *crv1.Pgcluster) ([]msgs.ShowClusterPod, error) {
242242
d := msgs.ShowClusterPod{}
243243
d.Name = p.Name
244244
d.Phase = string(p.Status.Phase)
245-
d.NodeName = p.Spec.NodeName
245+
d.NodeLabel = ""
246246
d.ReadyStatus = getReadyStatus(&p)
247247
//log.Infof("pod details are %v\n", p)
248248
d.PVCName = getPVCName(&p)
@@ -541,13 +541,33 @@ func CreateCluster(request *msgs.CreateClusterRequest) msgs.CreateClusterRespons
541541
}
542542
}
543543

544-
if request.NodeName != "" {
545-
valid, reason, allNodes := apiserver.IsValidNodeName(request.NodeName)
546-
if !valid {
544+
if request.NodeLabel != "" {
545+
parts := strings.Split(request.NodeLabel, "=")
546+
if len(parts) != 2 {
547547
resp.Status.Code = msgs.Error
548-
resp.Status.Msg = request.NodeName + " NodeName was not valid, " + reason + " valid nodes are " + allNodes
548+
resp.Status.Msg = request.NodeLabel + " node label does not follow key=value format"
549549
return resp
550550
}
551+
552+
keyValid, valueValid, err := apiserver.IsValidNodeLabel(parts[0], parts[1])
553+
if err != nil {
554+
resp.Status.Code = msgs.Error
555+
resp.Status.Msg = err.Error()
556+
return resp
557+
}
558+
559+
if !keyValid {
560+
resp.Status.Code = msgs.Error
561+
resp.Status.Msg = request.NodeLabel + " key was not valid .. check node labels for correct values to specify"
562+
return resp
563+
}
564+
if !valueValid {
565+
resp.Status.Code = msgs.Error
566+
resp.Status.Msg = request.NodeLabel + " node label value was not valid .. check node labels for correct values to specify"
567+
return resp
568+
}
569+
userLabelsMap["NodeLabelKey"] = parts[0]
570+
userLabelsMap["NodeLabelValue"] = parts[1]
551571
}
552572

553573
if request.ReplicaStorageConfig != "" {
@@ -588,15 +608,6 @@ func CreateCluster(request *msgs.CreateClusterRequest) msgs.CreateClusterRespons
588608

589609
// Create an instance of our CRD
590610

591-
if request.NodeName != "" {
592-
err = validateNodeName(request.NodeName)
593-
if err != nil {
594-
resp.Status.Code = msgs.Error
595-
resp.Status.Msg = err.Error()
596-
return resp
597-
}
598-
}
599-
600611
newInstance := getClusterParams(request, clusterName, userLabelsMap)
601612
validateConfigPolicies(request.Policies)
602613

@@ -708,7 +719,6 @@ func getClusterParams(request *msgs.CreateClusterRequest, name string, userLabel
708719
spec.RootPassword = ""
709720
spec.Replicas = "0"
710721
spec.Strategy = "1"
711-
spec.NodeName = request.NodeName
712722
spec.UserLabels = userLabelsMap
713723

714724
//override any values from config file
@@ -799,32 +809,6 @@ func validateSecretFrom(secretname string) error {
799809
return err
800810
}
801811

802-
func validateNodeName(nodeName string) error {
803-
var err error
804-
lo := meta_v1.ListOptions{}
805-
nodes, err := apiserver.Clientset.CoreV1().Nodes().List(lo)
806-
if err != nil {
807-
panic(err.Error())
808-
}
809-
810-
found := false
811-
allNodes := ""
812-
813-
for _, node := range nodes.Items {
814-
if node.Name == nodeName {
815-
found = true
816-
}
817-
allNodes += node.Name + " "
818-
}
819-
820-
if found == false {
821-
return errors.New("node name was not found...valid nodes include " + allNodes)
822-
}
823-
824-
return err
825-
826-
}
827-
828812
func getReadyStatus(pod *v1.Pod) string {
829813
readyCount := 0
830814
containerCount := 0

apiserver/root.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -368,36 +368,34 @@ func IsValidStorageName(name string) bool {
368368
return ok
369369
}
370370

371-
// IsValidNodeName returns true or false if
372-
// a node is valid, returns a string that
373-
// describes the not valid condition, and
374-
// lastly a string of all valid nodes found
375-
func IsValidNodeName(nodeName string) (bool, string, string) {
371+
// IsValidNodeLabel
372+
// returns bool for key validity
373+
// returns bool for value validity
374+
// returns error
375+
func IsValidNodeLabel(key, value string) (bool, bool, error) {
376376

377377
var err error
378-
found := false
379-
allNodes := ""
378+
keyValid := false
379+
valueValid := false
380380

381-
lo := meta_v1.ListOptions{}
382-
nodes, err := Clientset.CoreV1().Nodes().List(lo)
381+
nodes, err := Clientset.CoreV1().Nodes().List(meta_v1.ListOptions{})
383382
if err != nil {
384383
log.Error(err)
385-
return false, err.Error(), allNodes
384+
return false, false, err
386385
}
387386

387+
var v string
388388
for _, node := range nodes.Items {
389-
log.Infof("%v\n", node)
390-
if node.Name == nodeName {
391-
found = true
389+
v = node.ObjectMeta.Labels[key]
390+
if v != "" {
391+
keyValid = true
392+
}
393+
if v == value {
394+
valueValid = true
392395
}
393-
allNodes += node.Name + " "
394-
}
395-
396-
if found == false {
397-
return false, "not found", allNodes
398396
}
399397

400-
return true, "", allNodes
398+
return keyValid, valueValid, err
401399
}
402400

403401
func IsValidContainerResourceValues() bool {

apiservermsgs/clustermsgs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
type CreateClusterRequest struct {
2424
Name string
2525
Namespace string
26-
NodeName string
26+
NodeLabel string
2727
Password string
2828
SecretFrom string
2929
BackupPVC string
@@ -58,7 +58,7 @@ type ShowClusterService struct {
5858
type ShowClusterPod struct {
5959
Name string
6060
Phase string
61-
NodeName string
61+
NodeLabel string
6262
PVCName string
6363
ReadyStatus string
6464
Primary bool

conf/postgres-operator/cluster/1/affinity.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
"weight": 1,
55
"preference": {
66
"matchExpressions": [{
7-
"key": "kubernetes.io/hostname",
7+
"key": "{{.NodeLabelKey}}",
88
"operator": "{{.OperatorValue}}",
99
"values": [
10-
"{{.Node}}"
10+
"{{.NodeLabelValue}}"
1111
]
1212
}]
1313
}

operator/cluster/cluster_strategy_1.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ const AffinityInOperator = "In"
4040
const AFFINITY_NOTINOperator = "NotIn"
4141

4242
type affinityTemplateFields struct {
43-
Node string
44-
OperatorValue string
43+
NodeLabelKey string
44+
NodeLabelValue string
45+
OperatorValue string
4546
}
4647

4748
type containerResourcesTemplateFields struct {
@@ -121,7 +122,7 @@ func (r Strategy1) AddCluster(clientset *kubernetes.Clientset, client *rest.REST
121122
RootSecretName: cl.Spec.RootSecretName,
122123
PrimarySecretName: cl.Spec.PrimarySecretName,
123124
UserSecretName: cl.Spec.UserSecretName,
124-
NodeSelector: GetAffinity(cl.Spec.NodeName, "In"),
125+
NodeSelector: GetAffinity(cl.Spec.UserLabels["NodeLabelKey"], cl.Spec.UserLabels["NodeLabelValue"], "In"),
125126
ContainerResources: GetContainerResources(&cl.Spec.ContainerResources),
126127
ConfVolume: GetConfVolume(clientset, cl.Spec.CustomConfig, namespace),
127128
CollectAddon: GetCollectAddon(&cl.Spec),
@@ -364,7 +365,7 @@ func (r Strategy1) CreateReplica(serviceName string, clientset *kubernetes.Clien
364365
PrimarySecretName: cl.Spec.PrimarySecretName,
365366
ContainerResources: GetContainerResources(&cl.Spec.ContainerResources),
366367
UserSecretName: cl.Spec.UserSecretName,
367-
NodeSelector: GetAffinity(cl.Spec.NodeName, "NotIn"),
368+
NodeSelector: GetAffinity(cl.Spec.UserLabels["NodeLabelKey"], cl.Spec.UserLabels["NodeLabelValue"], "NotIn"),
368369
}
369370

370371
switch cl.Spec.ReplicaStorage.StorageType {
@@ -417,15 +418,16 @@ func getPrimaryLabels(Name string, ClusterName string, replicaFlag bool, userLab
417418
}
418419

419420
// GetAffinity ...
420-
func GetAffinity(nodeName string, operator string) string {
421-
log.Debugf("GetAffinity with nodeName=[%s] and operator=[%s]\n", nodeName, operator)
421+
func GetAffinity(nodeLabelKey, nodeLabelValue string, operator string) string {
422+
log.Debugf("GetAffinity with nodeLabelKey=[%s] nodeLabelKey=[%s] and operator=[%s]\n", nodeLabelKey, nodeLabelValue, operator)
422423
output := ""
423-
if nodeName == "" {
424+
if nodeLabelKey == "" {
424425
return output
425426
}
426427

427428
affinityTemplateFields := affinityTemplateFields{}
428-
affinityTemplateFields.Node = nodeName
429+
affinityTemplateFields.NodeLabelKey = nodeLabelKey
430+
affinityTemplateFields.NodeLabelValue = nodeLabelValue
429431
affinityTemplateFields.OperatorValue = operator
430432

431433
var affinityDoc bytes.Buffer
@@ -554,7 +556,7 @@ func (r Strategy1) Scale(clientset *kubernetes.Clientset, client *rest.RESTClien
554556
RootSecretName: cluster.Spec.RootSecretName,
555557
PrimarySecretName: cluster.Spec.PrimarySecretName,
556558
UserSecretName: cluster.Spec.UserSecretName,
557-
NodeSelector: GetAffinity(cluster.Spec.NodeName, "NotIn"),
559+
NodeSelector: GetAffinity(cluster.Spec.UserLabels["NodeLabelKey"], cluster.Spec.UserLabels["NodeLabelValue"], "NotIn"),
558560
}
559561

560562
switch replica.Spec.ReplicaStorage.StorageType {

operator/cluster/upgrade_strategy_1.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func (r Strategy1) MinorUpgrade(clientset *kubernetes.Clientset, restclient *res
9191
RootSecretName: cl.Spec.RootSecretName,
9292
PrimarySecretName: cl.Spec.PrimarySecretName,
9393
UserSecretName: cl.Spec.UserSecretName,
94-
NodeSelector: GetAffinity(cl.Spec.NodeName, "In"),
94+
NodeSelector: GetAffinity(cl.Spec.UserLabels["NodeLabelKey"], cl.Spec.UserLabels["NodeLabelValue"], "In"),
9595
ConfVolume: GetConfVolume(clientset, cl.Spec.CustomConfig, namespace),
9696
CollectAddon: GetCollectAddon(&cl.Spec),
9797
}

pgo/cmd/cluster.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func printCluster(detail *msgs.ShowClusterDetail) {
155155
fmt.Println("cluster : " + detail.Cluster.Spec.Name + " (" + detail.Cluster.Spec.CCPImageTag + ")")
156156

157157
for _, pod := range detail.Pods {
158-
fmt.Println(TreeBranch + "pod : " + pod.Name + " (" + string(pod.Phase) + " on " + pod.NodeName + ") (" + pod.ReadyStatus + ")")
158+
fmt.Println(TreeBranch + "pod : " + pod.Name + " (" + string(pod.Phase) + " on " + pod.NodeLabel + ") (" + pod.ReadyStatus + ")")
159159
fmt.Println(TreeBranch + "pvc : " + pod.PVCName)
160160
}
161161

@@ -212,7 +212,7 @@ func createCluster(args []string) {
212212

213213
r := new(msgs.CreateClusterRequest)
214214
r.Name = args[0]
215-
r.NodeName = NodeName
215+
r.NodeLabel = NodeLabel
216216
r.Password = Password
217217
r.SecretFrom = SecretFrom
218218
r.BackupPVC = BackupPVC

pgo/cmd/create.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var CCPImageTag string
3131
var Password string
3232
var SecretFrom, BackupPath, BackupPVC string
3333
var PoliciesFlag, PolicyFile, PolicyURL string
34-
var NodeName string
34+
var NodeLabel string
3535
var UserLabels string
3636
var IngestConfig string
3737

@@ -171,7 +171,7 @@ func init() {
171171
createClusterCmd.Flags().StringVarP(&CustomConfig, "custom-config", "g", "", "The name of a configMap that holds custom PG config files used to override the defaults")
172172
createClusterCmd.Flags().StringVarP(&StorageConfig, "storage-config", "", "", "The name of a Storage config in pgo.yaml to use for the cluster storage.")
173173
createClusterCmd.Flags().StringVarP(&ReplicaStorageConfig, "replica-storage-config", "", "", "The name of a Storage config in pgo.yaml to use for the cluster replica storage.")
174-
createClusterCmd.Flags().StringVarP(&NodeName, "node-name", "", "", "The node on which to place the primary database, if not set any node is used")
174+
createClusterCmd.Flags().StringVarP(&NodeLabel, "node-label", "", "", "The node label (key=value) to use in placing the primary database, if not set any node is used")
175175
createClusterCmd.Flags().StringVarP(&Password, "password", "w", "", "The password to use for initial database users")
176176
createClusterCmd.Flags().StringVarP(&SecretFrom, "secret-from", "s", "", "The cluster name to use when restoring secrets")
177177
createClusterCmd.Flags().StringVarP(&BackupPVC, "backup-pvc", "p", "", "The backup archive PVC to restore from")

0 commit comments

Comments
 (0)