blob: b863f90bdb4147fae8f10c1ec68d5cc021344cf8 [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 kube
import (
"fmt"
"path/filepath"
"strings"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/config/resource"
"github.com/apache/dubbo-go-pixiu/pkg/config/schema/collection"
"github.com/apache/dubbo-go-pixiu/pkg/config/schema/collections"
)
// Origin is a K8s specific implementation of resource.Origin
type Origin struct {
Collection collection.Name
Kind string
FullName resource.FullName
Version resource.Version
Ref resource.Reference
FieldsMap map[string]int
}
var (
_ resource.Origin = &Origin{}
_ resource.Reference = &Position{}
)
// FriendlyName implements resource.Origin
func (o *Origin) FriendlyName() string {
parts := strings.Split(o.FullName.String(), "/")
if len(parts) == 2 {
// The istioctl convention is <type> [<namespace>/]<name>.
// This code has no notion of a default and always shows the namespace.
return fmt.Sprintf("%s %s/%s", o.Kind, parts[0], parts[1])
}
return fmt.Sprintf("%s %s", o.Kind, o.FullName.String())
}
func (o *Origin) Comparator() string {
return o.Kind + "/" + o.FullName.Name.String() + "/" + o.FullName.Namespace.String()
}
// Namespace implements resource.Origin
func (o *Origin) Namespace() resource.Namespace {
// Special case: the namespace of a namespace resource is its own name
if o.Collection == collections.K8SCoreV1Namespaces.Name() {
return resource.Namespace(o.FullName.Name)
}
return o.FullName.Namespace
}
// Reference implements resource.Origin
func (o *Origin) Reference() resource.Reference {
return o.Ref
}
// GetFieldMap implements resource.Origin
func (o *Origin) FieldMap() map[string]int {
return o.FieldsMap
}
// Position is a representation of the location of a source.
type Position struct {
Filename string // filename, if any
Line int // line number, starting at 1
}
// String outputs the string representation of the position.
func (p *Position) String() string {
s := p.Filename
// TODO: support json file position.
if p.isValid() && filepath.Ext(p.Filename) != ".json" {
if s != "" {
s += ":"
}
s += fmt.Sprintf("%d", p.Line)
}
return s
}
func (p *Position) isValid() bool {
return p.Line > 0 && p.Filename != ""
}