github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/base/ca/override/override.go (about)

     1  /*
     2   * Copyright contributors to the Hyperledger Fabric Operator project
     3   *
     4   * SPDX-License-Identifier: Apache-2.0
     5   *
     6   * Licensed under the Apache License, Version 2.0 (the "License");
     7   * you may not use this file except in compliance with the License.
     8   * You may obtain a copy of the License at:
     9   *
    10   * 	  http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing, software
    13   * distributed under the License is distributed on an "AS IS" BASIS,
    14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15   * See the License for the specific language governing permissions and
    16   * limitations under the License.
    17   */
    18  
    19  package override
    20  
    21  import (
    22  	"encoding/json"
    23  	"strings"
    24  
    25  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    26  	v1 "github.com/IBM-Blockchain/fabric-operator/pkg/apis/ca/v1"
    27  	"github.com/IBM-Blockchain/fabric-operator/pkg/k8s/controllerclient"
    28  	"github.com/IBM-Blockchain/fabric-operator/pkg/offering/common"
    29  	corev1 "k8s.io/api/core/v1"
    30  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    31  )
    32  
    33  type Override struct {
    34  	Client controllerclient.Client
    35  }
    36  
    37  func (o *Override) IsPostgres(instance *current.IBPCA) bool {
    38  	if instance.Spec.ConfigOverride != nil {
    39  		if instance.Spec.ConfigOverride.CA != nil {
    40  			caOverrides := &v1.ServerConfig{}
    41  			err := json.Unmarshal(instance.Spec.ConfigOverride.CA.Raw, caOverrides)
    42  			if err != nil {
    43  				return false
    44  			}
    45  
    46  			if caOverrides.DB != nil {
    47  				if strings.ToLower(caOverrides.DB.Type) == "postgres" {
    48  					return true
    49  				}
    50  			}
    51  		}
    52  
    53  		if instance.Spec.ConfigOverride.TLSCA != nil {
    54  			tlscaOverrides := &v1.ServerConfig{}
    55  			err := json.Unmarshal(instance.Spec.ConfigOverride.TLSCA.Raw, tlscaOverrides)
    56  			if err != nil {
    57  				return false
    58  			}
    59  
    60  			if tlscaOverrides.DB != nil {
    61  				if strings.ToLower(tlscaOverrides.DB.Type) == "postgres" {
    62  					return true
    63  				}
    64  			}
    65  		}
    66  	}
    67  
    68  	return false
    69  }
    70  
    71  func (o *Override) GetAffinity(instance *current.IBPCA) *corev1.Affinity {
    72  	affinity := &corev1.Affinity{}
    73  
    74  	affinity.NodeAffinity = o.GetNodeAffinity(instance)
    75  	affinity.PodAntiAffinity = o.GetPodAntiAffinity(instance)
    76  
    77  	return affinity
    78  }
    79  
    80  func (o *Override) GetNodeAffinity(instance *current.IBPCA) *corev1.NodeAffinity {
    81  	arch := instance.Spec.Arch
    82  	zone := instance.Spec.Zone
    83  	region := instance.Spec.Region
    84  
    85  	nodeSelectorTerms := []corev1.NodeSelectorTerm{
    86  		corev1.NodeSelectorTerm{
    87  			MatchExpressions: []corev1.NodeSelectorRequirement{},
    88  		},
    89  		corev1.NodeSelectorTerm{
    90  			MatchExpressions: []corev1.NodeSelectorRequirement{},
    91  		},
    92  	}
    93  	common.AddArchSelector(arch, &nodeSelectorTerms)
    94  
    95  	if !o.IsPostgres(instance) {
    96  		common.AddZoneSelector(zone, &nodeSelectorTerms)
    97  		common.AddRegionSelector(region, &nodeSelectorTerms)
    98  	}
    99  
   100  	if len(nodeSelectorTerms[0].MatchExpressions) != 0 {
   101  		return &corev1.NodeAffinity{
   102  			RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
   103  				NodeSelectorTerms: nodeSelectorTerms,
   104  			},
   105  		}
   106  	}
   107  
   108  	return nil
   109  }
   110  
   111  func (o *Override) GetPodAntiAffinity(instance *current.IBPCA) *corev1.PodAntiAffinity {
   112  	antiaffinity := &corev1.PodAntiAffinity{
   113  		PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{
   114  			corev1.WeightedPodAffinityTerm{
   115  				Weight: 100,
   116  				PodAffinityTerm: corev1.PodAffinityTerm{
   117  					LabelSelector: &metav1.LabelSelector{
   118  						MatchExpressions: []metav1.LabelSelectorRequirement{
   119  							metav1.LabelSelectorRequirement{
   120  								Key:      "app",
   121  								Operator: metav1.LabelSelectorOpIn,
   122  								Values:   []string{instance.GetName()},
   123  							},
   124  						},
   125  					},
   126  					TopologyKey: "topology.kubernetes.io/zone",
   127  				},
   128  			},
   129  			corev1.WeightedPodAffinityTerm{
   130  				Weight: 100,
   131  				PodAffinityTerm: corev1.PodAffinityTerm{
   132  					LabelSelector: &metav1.LabelSelector{
   133  						MatchExpressions: []metav1.LabelSelectorRequirement{
   134  							metav1.LabelSelectorRequirement{
   135  								Key:      "app",
   136  								Operator: metav1.LabelSelectorOpIn,
   137  								Values:   []string{instance.GetName()},
   138  							},
   139  						},
   140  					},
   141  					TopologyKey: "failure-domain.beta.kubernetes.io/zone",
   142  				},
   143  			},
   144  		},
   145  	}
   146  
   147  	if o.IsPostgres(instance) {
   148  		term := corev1.WeightedPodAffinityTerm{
   149  			Weight: 100,
   150  			PodAffinityTerm: corev1.PodAffinityTerm{
   151  				LabelSelector: &metav1.LabelSelector{
   152  					MatchExpressions: []metav1.LabelSelectorRequirement{
   153  						metav1.LabelSelectorRequirement{
   154  							Key:      "app",
   155  							Operator: metav1.LabelSelectorOpIn,
   156  							Values:   []string{instance.GetName()},
   157  						},
   158  					},
   159  				},
   160  				TopologyKey: "kubernetes.io/hostname",
   161  			},
   162  		}
   163  		antiaffinity.PreferredDuringSchedulingIgnoredDuringExecution = append(antiaffinity.PreferredDuringSchedulingIgnoredDuringExecution, term)
   164  	}
   165  
   166  	return antiaffinity
   167  }