# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

{{- $svc := .Spec.Service.Template }}
apiVersion: v1
kind: Service
metadata:
  name: {{ .Name }}-oap
  namespace: {{ .Namespace }}
  labels:
    app: oap
    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
    operator.skywalking.apache.org/application: oapserver
    operator.skywalking.apache.org/component: service
spec:
  type: {{ $svc.Type }}
  ports:
  - port: 12800
    name: rest
  - port: 11800
    name: grpc
  - port: 1234
    name: http-monitoring
  {{- if $svc.ExternalIPs }}
  externalIPs:
    {{- range $value := $svc.ExternalIPs }}
    - {{ $value | quote }}
    {{- end }}
  {{- end }}
  {{- if $svc.LoadBalancerIP }}
  loadBalancerIP: {{ $svc.LoadBalancerIP }}
  {{- end }}
  {{- if $svc.LoadBalancerSourceRanges }}
  loadBalancerSourceRanges:
    {{- range $value := $svc.LoadBalancerSourceRanges }}
    - {{ $value | quote }}
    {{- end }}
  {{- end }}
  selector:
    app: oap
    operator.skywalking.apache.org/oap-server-name: {{ .Name }}

