blob: 89f3ccdf15d17a42cc7c97f7d6173fb54ab5ff44 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed 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.
package echo
import (
"fmt"
"strconv"
"strings"
)
import (
"istio.io/api/annotation"
)
type AnnotationType string
const (
WorkloadAnnotation AnnotationType = "workload"
)
type Annotation struct {
Name string
Type AnnotationType
Default AnnotationValue
}
var (
SidecarInject = workloadAnnotation(annotation.SidecarInject.Name, "true")
SidecarRewriteAppHTTPProbers = workloadAnnotation(annotation.SidecarRewriteAppHTTPProbers.Name, "")
SidecarBootstrapOverride = workloadAnnotation(annotation.SidecarBootstrapOverride.Name, "")
SidecarVolumeMount = workloadAnnotation(annotation.SidecarUserVolumeMount.Name, "")
SidecarVolume = workloadAnnotation(annotation.SidecarUserVolume.Name, "")
SidecarConfig = workloadAnnotation(annotation.ProxyConfig.Name, "")
SidecarInterceptionMode = workloadAnnotation(annotation.SidecarInterceptionMode.Name, "REDIRECT")
SidecarIncludeInboundPorts = workloadAnnotation(annotation.SidecarTrafficIncludeInboundPorts.Name, "")
SidecarIncludeOutboundIPRanges = workloadAnnotation(annotation.SidecarTrafficIncludeOutboundIPRanges.Name, "")
SidecarProxyConfig = workloadAnnotation(annotation.ProxyConfig.Name, "")
SidecarInjectTemplates = workloadAnnotation(annotation.InjectTemplates.Name, "")
)
type AnnotationValue struct {
Value string
}
func (v *AnnotationValue) Get() string {
return v.Value
}
func (v *AnnotationValue) AsBool() bool {
return toBool(v.Get())
}
func (v *AnnotationValue) AsInt() int {
return toInt(v.Get())
}
func (v *AnnotationValue) Set(arg string) *AnnotationValue {
v.Value = arg
return v
}
func (v *AnnotationValue) SetBool(arg bool) *AnnotationValue {
v.Value = strconv.FormatBool(arg)
return v
}
func (v *AnnotationValue) SetInt(arg int) *AnnotationValue {
v.Value = strconv.Itoa(arg)
return v
}
func NewAnnotationValue() *AnnotationValue {
return &AnnotationValue{}
}
func workloadAnnotation(name string, value string) Annotation {
return Annotation{
Name: name,
Type: WorkloadAnnotation,
Default: AnnotationValue{
Value: value,
},
}
}
type Annotations map[Annotation]*AnnotationValue
func NewAnnotations() Annotations {
return make(Annotations)
}
func (a Annotations) Set(k Annotation, v string) Annotations {
a[k] = &AnnotationValue{v}
return a
}
func (a Annotations) SetBool(k Annotation, v bool) Annotations {
a[k] = NewAnnotationValue().SetBool(v)
return a
}
func (a Annotations) SetInt(k Annotation, v int) Annotations {
a[k] = NewAnnotationValue().SetInt(v)
return a
}
func (a Annotations) getOrDefault(k Annotation) *AnnotationValue {
anno, ok := a[k]
if !ok {
anno = &k.Default
}
return anno
}
func (a Annotations) GetByName(k string) string {
for keys := range a {
if keys.Name == k {
return a.Get(keys)
}
}
return ""
}
func (a Annotations) Get(k Annotation) string {
return a.getOrDefault(k).Value
}
func (a Annotations) GetBool(k Annotation) bool {
return a.getOrDefault(k).AsBool()
}
func (a Annotations) GetInt(k Annotation) int {
return a.getOrDefault(k).AsInt()
}
func toBool(v string) bool {
switch strings.ToLower(v) {
// http://yaml.org/type/bool.html
case "y", "yes", "true", "on":
return true
default:
return false
}
}
func toInt(v string) int {
i, err := strconv.Atoi(v)
if err != nil {
panic(fmt.Sprintf("failed parsing int value: '%s'", v))
}
return i
}