github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/config/components.go (about)

     1  // Copyright (C) 2020, 2022, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package config
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"strings"
    10  
    11  	"github.com/verrazzano/verrazzano-monitoring-operator/pkg/constants"
    12  	"go.uber.org/zap"
    13  	corev1 "k8s.io/api/core/v1"
    14  )
    15  
    16  // ComponentDetails struct for component detail info
    17  type ComponentDetails struct {
    18  	Name              string
    19  	EndpointName      string
    20  	Image             string
    21  	ImagePullPolicy   corev1.PullPolicy
    22  	Port              int
    23  	DataDir           string
    24  	LivenessHTTPPath  string
    25  	ReadinessHTTPPath string
    26  	Privileged        bool
    27  	RunAsUser         int64
    28  	EnvName           string
    29  	OidcProxy         *ComponentDetails
    30  	Optional          bool
    31  	Disabled          bool
    32  }
    33  
    34  // AllComponentDetails is array of all ComponentDetails
    35  var AllComponentDetails = []*ComponentDetails{&Grafana, &Kibana, &OpenSearchDashboards, &ElasticsearchIngest, &ElasticsearchMaster, &ElasticsearchData, &ElasticsearchInit, &API, &OidcProxy}
    36  
    37  // StorageEnableComponents is storage operation-related stuff
    38  var StorageEnableComponents = []*ComponentDetails{&Grafana}
    39  
    40  // Grafana is the default Grafana configuration
    41  var Grafana = ComponentDetails{
    42  	Name:              "grafana",
    43  	EnvName:           "GRAFANA_IMAGE",
    44  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
    45  	Port:              3000,
    46  	DataDir:           "/var/lib/grafana",
    47  	LivenessHTTPPath:  "/api/health",
    48  	ReadinessHTTPPath: "/api/health",
    49  	Privileged:        false,
    50  	OidcProxy:         &OidcProxy,
    51  }
    52  
    53  // Prometheus is the default Prometheus configuration
    54  // Note: Update promtool version to match any version changes here
    55  //   - vmo/images/cirith-server-for-operator/docker-images
    56  var Prometheus = ComponentDetails{
    57  	Name:              "prometheus",
    58  	EnvName:           "PROMETHEUS_IMAGE",
    59  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
    60  	Port:              9090,
    61  	DataDir:           "/prometheus",
    62  	LivenessHTTPPath:  "/-/healthy",
    63  	ReadinessHTTPPath: "/-/ready",
    64  	Privileged:        false,
    65  	RunAsUser:         int64(constants.NobodyUID),
    66  	OidcProxy:         &OidcProxy,
    67  }
    68  
    69  // AlertManager is the default AlertManager configuration
    70  // Note: Update amtool version to match any version changes here
    71  //   - vmo/images/cirith-server-for-operator/docker-images
    72  var AlertManager = ComponentDetails{
    73  	Name:              "alertmanager",
    74  	EnvName:           "ALERT_MANAGER_IMAGE",
    75  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
    76  	Port:              9093,
    77  	LivenessHTTPPath:  "/-/healthy",
    78  	ReadinessHTTPPath: "/-/ready",
    79  	Privileged:        false,
    80  }
    81  
    82  // ESWait is the InitContainer config; will wait for ES to reach stable healthy state
    83  var ESWait = ComponentDetails{
    84  	Name:            "wait-for-es",
    85  	EnvName:         "ELASTICSEARCH_WAIT_IMAGE",
    86  	ImagePullPolicy: constants.DefaultImagePullPolicy,
    87  }
    88  
    89  // Kibana is the default Kibana configuration
    90  var Kibana = ComponentDetails{
    91  	Name:              "kibana",
    92  	EnvName:           "KIBANA_IMAGE",
    93  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
    94  	Port:              5601,
    95  	LivenessHTTPPath:  "/api/status",
    96  	ReadinessHTTPPath: "/api/status",
    97  	Privileged:        false,
    98  	OidcProxy:         &OidcProxy,
    99  }
   100  
   101  // OpenSearchDashboards is the default OpenSearchDashboards configuration
   102  var OpenSearchDashboards = ComponentDetails{
   103  	Name:              "osd",
   104  	EnvName:           "KIBANA_IMAGE",
   105  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   106  	Port:              5601,
   107  	LivenessHTTPPath:  "/api/status",
   108  	ReadinessHTTPPath: "/api/status",
   109  	Privileged:        false,
   110  	OidcProxy:         &OidcProxy,
   111  }
   112  
   113  // OpenSearchDashboardsRedirect is the default OpenSearchDashboardsRedirect configuration
   114  var OpenSearchDashboardsRedirect = ComponentDetails{
   115  	Name:              "osd-redirect",
   116  	EndpointName:      "kibana",
   117  	EnvName:           "KIBANA_IMAGE",
   118  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   119  	Port:              5601,
   120  	LivenessHTTPPath:  "/api/status",
   121  	ReadinessHTTPPath: "/api/status",
   122  	Privileged:        false,
   123  	OidcProxy:         &OidcProxy,
   124  }
   125  
   126  // OidcProxy is the default OIDC proxy configuration
   127  var OidcProxy = ComponentDetails{
   128  	Name:            "oidc",
   129  	EnvName:         "OIDC_PROXY_IMAGE",
   130  	ImagePullPolicy: constants.DefaultImagePullPolicy,
   131  	Port:            constants.OidcProxyPort,
   132  }
   133  
   134  // ElasticsearchIngest is the default Elasticsearch IngestNodes configuration
   135  var ElasticsearchIngest = ComponentDetails{
   136  	Name:              "es-ingest",
   137  	EndpointName:      "elasticsearch",
   138  	EnvName:           "ELASTICSEARCH_IMAGE",
   139  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   140  	Port:              constants.OSHTTPPort,
   141  	LivenessHTTPPath:  "/_cluster/health",
   142  	ReadinessHTTPPath: "/_cluster/health",
   143  	Privileged:        false,
   144  	OidcProxy:         &OidcProxy,
   145  }
   146  
   147  // OpensearchIngest is the default Opensearch IngestNodes configuration
   148  var OpensearchIngest = ComponentDetails{
   149  	Name:              "os-ingest",
   150  	EndpointName:      "opensearch",
   151  	EnvName:           "ELASTICSEARCH_IMAGE",
   152  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   153  	Port:              constants.OSHTTPPort,
   154  	LivenessHTTPPath:  "/_cluster/health",
   155  	ReadinessHTTPPath: "/_cluster/health",
   156  	Privileged:        false,
   157  	OidcProxy:         &OidcProxy,
   158  }
   159  
   160  // OpensearchIngestRedirect is the default OpensearchIngestRedirect IngestNodes configuration
   161  var OpensearchIngestRedirect = ComponentDetails{
   162  	Name:              "os-redirect",
   163  	EndpointName:      "elasticsearch",
   164  	EnvName:           "ELASTICSEARCH_IMAGE",
   165  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   166  	Port:              constants.OSHTTPPort,
   167  	LivenessHTTPPath:  "/_cluster/health",
   168  	ReadinessHTTPPath: "/_cluster/health",
   169  	Privileged:        false,
   170  	OidcProxy:         &OidcProxy,
   171  }
   172  
   173  // ElasticsearchMaster is the default Elasticsearch MasterNodes configuration
   174  var ElasticsearchMaster = ComponentDetails{
   175  	Name:            "es-master",
   176  	EnvName:         "ELASTICSEARCH_IMAGE",
   177  	ImagePullPolicy: constants.DefaultImagePullPolicy,
   178  	Port:            constants.OSTransportPort,
   179  	Privileged:      false,
   180  }
   181  
   182  // ElasticsearchData is the default Elasticsearch DataNodes configuration
   183  var ElasticsearchData = ComponentDetails{
   184  	Name:              "es-data",
   185  	EnvName:           "ELASTICSEARCH_IMAGE",
   186  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   187  	Port:              constants.OSHTTPPort,
   188  	DataDir:           "/usr/share/opensearch/data",
   189  	LivenessHTTPPath:  "/_cluster/health",
   190  	ReadinessHTTPPath: "/_cluster/health",
   191  	Privileged:        false,
   192  }
   193  
   194  // ElasticsearchInit contains Elasticsearch init container info
   195  var ElasticsearchInit = ComponentDetails{
   196  	Name:            "elasticsearch-init",
   197  	EnvName:         "ELASTICSEARCH_INIT_IMAGE",
   198  	ImagePullPolicy: constants.DefaultImagePullPolicy,
   199  	Privileged:      true,
   200  }
   201  
   202  // API is the default API configuration
   203  var API = ComponentDetails{
   204  	Name:              "api",
   205  	EnvName:           "VERRAZZANO_MONITORING_INSTANCE_API_IMAGE",
   206  	ImagePullPolicy:   constants.DefaultImagePullPolicy,
   207  	Port:              9097,
   208  	LivenessHTTPPath:  "/healthcheck",
   209  	ReadinessHTTPPath: "/healthcheck",
   210  	Privileged:        false,
   211  	Optional:          true,
   212  }
   213  
   214  const (
   215  	eswaitTargetVersionEnv = "ELASTICSEARCH_WAIT_TARGET_VERSION"
   216  	oidcAuthEnabled        = "OIDC_AUTH_ENABLED"
   217  )
   218  
   219  // ESWaitTargetVersion contains value for environment variable ELASTICSEARCH_WAIT_TARGET_VERSION
   220  var ESWaitTargetVersion string
   221  
   222  // InitComponentDetails initialize all components and check ELASTICSEARCH_WAIT_TARGET_VERSION
   223  func InitComponentDetails() error {
   224  	//oidcAuthEnabled defaults to true
   225  	oidcAuthEnabled := !strings.EqualFold("false", os.Getenv(oidcAuthEnabled))
   226  	// Initialize the images to use
   227  	for _, component := range AllComponentDetails {
   228  		if len(component.EnvName) > 0 {
   229  			component.Image = os.Getenv(component.EnvName)
   230  			if len(component.Image) == 0 {
   231  				if !component.Optional {
   232  					return fmt.Errorf("Failed, the environment variable %s translated to an empty string for component %s", component.EnvName, component.Name)
   233  				}
   234  				// if no image is provided for an optional component then disable it
   235  				zap.S().Infof("The environment variable %s translated to an empty string for optional component %s.  Marking component disabled.", component.EnvName, component.Name)
   236  				component.Disabled = true
   237  			}
   238  		}
   239  		if !oidcAuthEnabled {
   240  			component.OidcProxy = nil
   241  		}
   242  	}
   243  	ESWaitTargetVersion = os.Getenv(eswaitTargetVersionEnv)
   244  	if len(ESWaitTargetVersion) == 0 {
   245  		return fmt.Errorf("Failed, the environment variable %s translated to an empty string", eswaitTargetVersionEnv)
   246  	}
   247  	return nil
   248  }