1
0
mirror of https://github.com/rancher/types.git synced 2025-07-02 16:31:48 +00:00

Merge pull request #870 from gitlawr/istio

Add istio VirtualService and DestinationRule types
This commit is contained in:
Craig Jellick 2019-07-11 13:26:19 -07:00 committed by GitHub
commit da74a07be3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
71 changed files with 10536 additions and 1 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,72 @@
package v1alpha3
import (
istiov1alpha3 "github.com/knative/pkg/apis/istio/v1alpha3"
runtime "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DestinationRuleList) DeepCopyInto(out *DestinationRuleList) {
*out = *in
out.TypeMeta = in.TypeMeta
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]istiov1alpha3.DestinationRule, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DestinationRuleList.
func (in *DestinationRuleList) DeepCopy() *DestinationRuleList {
if in == nil {
return nil
}
out := new(DestinationRuleList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *DestinationRuleList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VirtualServiceList) DeepCopyInto(out *VirtualServiceList) {
*out = *in
out.TypeMeta = in.TypeMeta
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]istiov1alpha3.VirtualService, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualServiceList.
func (in *VirtualServiceList) DeepCopy() *VirtualServiceList {
if in == nil {
return nil
}
out := new(VirtualServiceList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *VirtualServiceList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}

View File

@ -0,0 +1,506 @@
package v1alpha3
import (
"context"
"github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/norman/controller"
"github.com/rancher/norman/objectclient"
"github.com/rancher/norman/resource"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/tools/cache"
)
var (
DestinationRuleGroupVersionKind = schema.GroupVersionKind{
Version: Version,
Group: GroupName,
Kind: "DestinationRule",
}
DestinationRuleResource = metav1.APIResource{
Name: "destinationrules",
SingularName: "destinationrule",
Namespaced: true,
Kind: DestinationRuleGroupVersionKind.Kind,
}
DestinationRuleGroupVersionResource = schema.GroupVersionResource{
Group: GroupName,
Version: Version,
Resource: "destinationrules",
}
)
func init() {
resource.Put(DestinationRuleGroupVersionResource)
}
func NewDestinationRule(namespace, name string, obj v1alpha3.DestinationRule) *v1alpha3.DestinationRule {
obj.APIVersion, obj.Kind = DestinationRuleGroupVersionKind.ToAPIVersionAndKind()
obj.Name = name
obj.Namespace = namespace
return &obj
}
type DestinationRuleList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []v1alpha3.DestinationRule `json:"items"`
}
type DestinationRuleHandlerFunc func(key string, obj *v1alpha3.DestinationRule) (runtime.Object, error)
type DestinationRuleChangeHandlerFunc func(obj *v1alpha3.DestinationRule) (runtime.Object, error)
type DestinationRuleLister interface {
List(namespace string, selector labels.Selector) (ret []*v1alpha3.DestinationRule, err error)
Get(namespace, name string) (*v1alpha3.DestinationRule, error)
}
type DestinationRuleController interface {
Generic() controller.GenericController
Informer() cache.SharedIndexInformer
Lister() DestinationRuleLister
AddHandler(ctx context.Context, name string, handler DestinationRuleHandlerFunc)
AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync DestinationRuleHandlerFunc)
AddClusterScopedHandler(ctx context.Context, name, clusterName string, handler DestinationRuleHandlerFunc)
AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, handler DestinationRuleHandlerFunc)
Enqueue(namespace, name string)
Sync(ctx context.Context) error
Start(ctx context.Context, threadiness int) error
}
type DestinationRuleInterface interface {
ObjectClient() *objectclient.ObjectClient
Create(*v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error)
GetNamespaced(namespace, name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error)
Get(name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error)
Update(*v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error)
Delete(name string, options *metav1.DeleteOptions) error
DeleteNamespaced(namespace, name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*DestinationRuleList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error
Controller() DestinationRuleController
AddHandler(ctx context.Context, name string, sync DestinationRuleHandlerFunc)
AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync DestinationRuleHandlerFunc)
AddLifecycle(ctx context.Context, name string, lifecycle DestinationRuleLifecycle)
AddFeatureLifecycle(ctx context.Context, enabled func() bool, name string, lifecycle DestinationRuleLifecycle)
AddClusterScopedHandler(ctx context.Context, name, clusterName string, sync DestinationRuleHandlerFunc)
AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, sync DestinationRuleHandlerFunc)
AddClusterScopedLifecycle(ctx context.Context, name, clusterName string, lifecycle DestinationRuleLifecycle)
AddClusterScopedFeatureLifecycle(ctx context.Context, enabled func() bool, name, clusterName string, lifecycle DestinationRuleLifecycle)
}
type destinationRuleLister struct {
controller *destinationRuleController
}
func (l *destinationRuleLister) List(namespace string, selector labels.Selector) (ret []*v1alpha3.DestinationRule, err error) {
err = cache.ListAllByNamespace(l.controller.Informer().GetIndexer(), namespace, selector, func(obj interface{}) {
ret = append(ret, obj.(*v1alpha3.DestinationRule))
})
return
}
func (l *destinationRuleLister) Get(namespace, name string) (*v1alpha3.DestinationRule, error) {
var key string
if namespace != "" {
key = namespace + "/" + name
} else {
key = name
}
obj, exists, err := l.controller.Informer().GetIndexer().GetByKey(key)
if err != nil {
return nil, err
}
if !exists {
return nil, errors.NewNotFound(schema.GroupResource{
Group: DestinationRuleGroupVersionKind.Group,
Resource: "destinationRule",
}, key)
}
return obj.(*v1alpha3.DestinationRule), nil
}
type destinationRuleController struct {
controller.GenericController
}
func (c *destinationRuleController) Generic() controller.GenericController {
return c.GenericController
}
func (c *destinationRuleController) Lister() DestinationRuleLister {
return &destinationRuleLister{
controller: c,
}
}
func (c *destinationRuleController) AddHandler(ctx context.Context, name string, handler DestinationRuleHandlerFunc) {
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.DestinationRule); ok {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *destinationRuleController) AddFeatureHandler(ctx context.Context, enabled func() bool, name string, handler DestinationRuleHandlerFunc) {
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if !enabled() {
return nil, nil
} else if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.DestinationRule); ok {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *destinationRuleController) AddClusterScopedHandler(ctx context.Context, name, cluster string, handler DestinationRuleHandlerFunc) {
resource.PutClusterScoped(DestinationRuleGroupVersionResource)
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.DestinationRule); ok && controller.ObjectInCluster(cluster, obj) {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *destinationRuleController) AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, cluster string, handler DestinationRuleHandlerFunc) {
resource.PutClusterScoped(DestinationRuleGroupVersionResource)
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if !enabled() {
return nil, nil
} else if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.DestinationRule); ok && controller.ObjectInCluster(cluster, obj) {
return handler(key, v)
} else {
return nil, nil
}
})
}
type destinationRuleFactory struct {
}
func (c destinationRuleFactory) Object() runtime.Object {
return &v1alpha3.DestinationRule{}
}
func (c destinationRuleFactory) List() runtime.Object {
return &DestinationRuleList{}
}
func (s *destinationRuleClient) Controller() DestinationRuleController {
s.client.Lock()
defer s.client.Unlock()
c, ok := s.client.destinationRuleControllers[s.ns]
if ok {
return c
}
genericController := controller.NewGenericController(DestinationRuleGroupVersionKind.Kind+"Controller",
s.objectClient)
c = &destinationRuleController{
GenericController: genericController,
}
s.client.destinationRuleControllers[s.ns] = c
s.client.starters = append(s.client.starters, c)
return c
}
type destinationRuleClient struct {
client *Client
ns string
objectClient *objectclient.ObjectClient
controller DestinationRuleController
}
func (s *destinationRuleClient) ObjectClient() *objectclient.ObjectClient {
return s.objectClient
}
func (s *destinationRuleClient) Create(o *v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error) {
obj, err := s.objectClient.Create(o)
return obj.(*v1alpha3.DestinationRule), err
}
func (s *destinationRuleClient) Get(name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error) {
obj, err := s.objectClient.Get(name, opts)
return obj.(*v1alpha3.DestinationRule), err
}
func (s *destinationRuleClient) GetNamespaced(namespace, name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error) {
obj, err := s.objectClient.GetNamespaced(namespace, name, opts)
return obj.(*v1alpha3.DestinationRule), err
}
func (s *destinationRuleClient) Update(o *v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error) {
obj, err := s.objectClient.Update(o.Name, o)
return obj.(*v1alpha3.DestinationRule), err
}
func (s *destinationRuleClient) Delete(name string, options *metav1.DeleteOptions) error {
return s.objectClient.Delete(name, options)
}
func (s *destinationRuleClient) DeleteNamespaced(namespace, name string, options *metav1.DeleteOptions) error {
return s.objectClient.DeleteNamespaced(namespace, name, options)
}
func (s *destinationRuleClient) List(opts metav1.ListOptions) (*DestinationRuleList, error) {
obj, err := s.objectClient.List(opts)
return obj.(*DestinationRuleList), err
}
func (s *destinationRuleClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return s.objectClient.Watch(opts)
}
// Patch applies the patch and returns the patched deployment.
func (s *destinationRuleClient) Patch(o *v1alpha3.DestinationRule, patchType types.PatchType, data []byte, subresources ...string) (*v1alpha3.DestinationRule, error) {
obj, err := s.objectClient.Patch(o.Name, o, patchType, data, subresources...)
return obj.(*v1alpha3.DestinationRule), err
}
func (s *destinationRuleClient) DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error {
return s.objectClient.DeleteCollection(deleteOpts, listOpts)
}
func (s *destinationRuleClient) AddHandler(ctx context.Context, name string, sync DestinationRuleHandlerFunc) {
s.Controller().AddHandler(ctx, name, sync)
}
func (s *destinationRuleClient) AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync DestinationRuleHandlerFunc) {
s.Controller().AddFeatureHandler(ctx, enabled, name, sync)
}
func (s *destinationRuleClient) AddLifecycle(ctx context.Context, name string, lifecycle DestinationRuleLifecycle) {
sync := NewDestinationRuleLifecycleAdapter(name, false, s, lifecycle)
s.Controller().AddHandler(ctx, name, sync)
}
func (s *destinationRuleClient) AddFeatureLifecycle(ctx context.Context, enabled func() bool, name string, lifecycle DestinationRuleLifecycle) {
sync := NewDestinationRuleLifecycleAdapter(name, false, s, lifecycle)
s.Controller().AddFeatureHandler(ctx, enabled, name, sync)
}
func (s *destinationRuleClient) AddClusterScopedHandler(ctx context.Context, name, clusterName string, sync DestinationRuleHandlerFunc) {
s.Controller().AddClusterScopedHandler(ctx, name, clusterName, sync)
}
func (s *destinationRuleClient) AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, sync DestinationRuleHandlerFunc) {
s.Controller().AddClusterScopedFeatureHandler(ctx, enabled, name, clusterName, sync)
}
func (s *destinationRuleClient) AddClusterScopedLifecycle(ctx context.Context, name, clusterName string, lifecycle DestinationRuleLifecycle) {
sync := NewDestinationRuleLifecycleAdapter(name+"_"+clusterName, true, s, lifecycle)
s.Controller().AddClusterScopedHandler(ctx, name, clusterName, sync)
}
func (s *destinationRuleClient) AddClusterScopedFeatureLifecycle(ctx context.Context, enabled func() bool, name, clusterName string, lifecycle DestinationRuleLifecycle) {
sync := NewDestinationRuleLifecycleAdapter(name+"_"+clusterName, true, s, lifecycle)
s.Controller().AddClusterScopedFeatureHandler(ctx, enabled, name, clusterName, sync)
}
type DestinationRuleIndexer func(obj *v1alpha3.DestinationRule) ([]string, error)
type DestinationRuleClientCache interface {
Get(namespace, name string) (*v1alpha3.DestinationRule, error)
List(namespace string, selector labels.Selector) ([]*v1alpha3.DestinationRule, error)
Index(name string, indexer DestinationRuleIndexer)
GetIndexed(name, key string) ([]*v1alpha3.DestinationRule, error)
}
type DestinationRuleClient interface {
Create(*v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error)
Get(namespace, name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error)
Update(*v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error)
Delete(namespace, name string, options *metav1.DeleteOptions) error
List(namespace string, opts metav1.ListOptions) (*DestinationRuleList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
Cache() DestinationRuleClientCache
OnCreate(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc)
OnChange(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc)
OnRemove(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc)
Enqueue(namespace, name string)
Generic() controller.GenericController
ObjectClient() *objectclient.ObjectClient
Interface() DestinationRuleInterface
}
type destinationRuleClientCache struct {
client *destinationRuleClient2
}
type destinationRuleClient2 struct {
iface DestinationRuleInterface
controller DestinationRuleController
}
func (n *destinationRuleClient2) Interface() DestinationRuleInterface {
return n.iface
}
func (n *destinationRuleClient2) Generic() controller.GenericController {
return n.iface.Controller().Generic()
}
func (n *destinationRuleClient2) ObjectClient() *objectclient.ObjectClient {
return n.Interface().ObjectClient()
}
func (n *destinationRuleClient2) Enqueue(namespace, name string) {
n.iface.Controller().Enqueue(namespace, name)
}
func (n *destinationRuleClient2) Create(obj *v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error) {
return n.iface.Create(obj)
}
func (n *destinationRuleClient2) Get(namespace, name string, opts metav1.GetOptions) (*v1alpha3.DestinationRule, error) {
return n.iface.GetNamespaced(namespace, name, opts)
}
func (n *destinationRuleClient2) Update(obj *v1alpha3.DestinationRule) (*v1alpha3.DestinationRule, error) {
return n.iface.Update(obj)
}
func (n *destinationRuleClient2) Delete(namespace, name string, options *metav1.DeleteOptions) error {
return n.iface.DeleteNamespaced(namespace, name, options)
}
func (n *destinationRuleClient2) List(namespace string, opts metav1.ListOptions) (*DestinationRuleList, error) {
return n.iface.List(opts)
}
func (n *destinationRuleClient2) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return n.iface.Watch(opts)
}
func (n *destinationRuleClientCache) Get(namespace, name string) (*v1alpha3.DestinationRule, error) {
return n.client.controller.Lister().Get(namespace, name)
}
func (n *destinationRuleClientCache) List(namespace string, selector labels.Selector) ([]*v1alpha3.DestinationRule, error) {
return n.client.controller.Lister().List(namespace, selector)
}
func (n *destinationRuleClient2) Cache() DestinationRuleClientCache {
n.loadController()
return &destinationRuleClientCache{
client: n,
}
}
func (n *destinationRuleClient2) OnCreate(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name+"-create", &destinationRuleLifecycleDelegate{create: sync})
}
func (n *destinationRuleClient2) OnChange(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name+"-change", &destinationRuleLifecycleDelegate{update: sync})
}
func (n *destinationRuleClient2) OnRemove(ctx context.Context, name string, sync DestinationRuleChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name, &destinationRuleLifecycleDelegate{remove: sync})
}
func (n *destinationRuleClientCache) Index(name string, indexer DestinationRuleIndexer) {
err := n.client.controller.Informer().GetIndexer().AddIndexers(map[string]cache.IndexFunc{
name: func(obj interface{}) ([]string, error) {
if v, ok := obj.(*v1alpha3.DestinationRule); ok {
return indexer(v)
}
return nil, nil
},
})
if err != nil {
panic(err)
}
}
func (n *destinationRuleClientCache) GetIndexed(name, key string) ([]*v1alpha3.DestinationRule, error) {
var result []*v1alpha3.DestinationRule
objs, err := n.client.controller.Informer().GetIndexer().ByIndex(name, key)
if err != nil {
return nil, err
}
for _, obj := range objs {
if v, ok := obj.(*v1alpha3.DestinationRule); ok {
result = append(result, v)
}
}
return result, nil
}
func (n *destinationRuleClient2) loadController() {
if n.controller == nil {
n.controller = n.iface.Controller()
}
}
type destinationRuleLifecycleDelegate struct {
create DestinationRuleChangeHandlerFunc
update DestinationRuleChangeHandlerFunc
remove DestinationRuleChangeHandlerFunc
}
func (n *destinationRuleLifecycleDelegate) HasCreate() bool {
return n.create != nil
}
func (n *destinationRuleLifecycleDelegate) Create(obj *v1alpha3.DestinationRule) (runtime.Object, error) {
if n.create == nil {
return obj, nil
}
return n.create(obj)
}
func (n *destinationRuleLifecycleDelegate) HasFinalize() bool {
return n.remove != nil
}
func (n *destinationRuleLifecycleDelegate) Remove(obj *v1alpha3.DestinationRule) (runtime.Object, error) {
if n.remove == nil {
return obj, nil
}
return n.remove(obj)
}
func (n *destinationRuleLifecycleDelegate) Updated(obj *v1alpha3.DestinationRule) (runtime.Object, error) {
if n.update == nil {
return obj, nil
}
return n.update(obj)
}

View File

@ -0,0 +1,63 @@
package v1alpha3
import (
"github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/norman/lifecycle"
"k8s.io/apimachinery/pkg/runtime"
)
type DestinationRuleLifecycle interface {
Create(obj *v1alpha3.DestinationRule) (runtime.Object, error)
Remove(obj *v1alpha3.DestinationRule) (runtime.Object, error)
Updated(obj *v1alpha3.DestinationRule) (runtime.Object, error)
}
type destinationRuleLifecycleAdapter struct {
lifecycle DestinationRuleLifecycle
}
func (w *destinationRuleLifecycleAdapter) HasCreate() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasCreate()
}
func (w *destinationRuleLifecycleAdapter) HasFinalize() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasFinalize()
}
func (w *destinationRuleLifecycleAdapter) Create(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Create(obj.(*v1alpha3.DestinationRule))
if o == nil {
return nil, err
}
return o, err
}
func (w *destinationRuleLifecycleAdapter) Finalize(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Remove(obj.(*v1alpha3.DestinationRule))
if o == nil {
return nil, err
}
return o, err
}
func (w *destinationRuleLifecycleAdapter) Updated(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Updated(obj.(*v1alpha3.DestinationRule))
if o == nil {
return nil, err
}
return o, err
}
func NewDestinationRuleLifecycleAdapter(name string, clusterScoped bool, client DestinationRuleInterface, l DestinationRuleLifecycle) DestinationRuleHandlerFunc {
adapter := &destinationRuleLifecycleAdapter{lifecycle: l}
syncFn := lifecycle.NewObjectLifecycleAdapter(name, clusterScoped, adapter, client.ObjectClient())
return func(key string, obj *v1alpha3.DestinationRule) (runtime.Object, error) {
newObj, err := syncFn(key, obj)
if o, ok := newObj.(runtime.Object); ok {
return o, err
}
return nil, err
}
}

View File

@ -0,0 +1,139 @@
package v1alpha3
import (
"context"
"sync"
"github.com/rancher/norman/controller"
"github.com/rancher/norman/objectclient"
"github.com/rancher/norman/objectclient/dynamic"
"github.com/rancher/norman/restwatch"
"k8s.io/client-go/rest"
)
type (
contextKeyType struct{}
contextClientsKeyType struct{}
)
type Interface interface {
RESTClient() rest.Interface
controller.Starter
VirtualServicesGetter
DestinationRulesGetter
}
type Clients struct {
Interface Interface
VirtualService VirtualServiceClient
DestinationRule DestinationRuleClient
}
type Client struct {
sync.Mutex
restClient rest.Interface
starters []controller.Starter
virtualServiceControllers map[string]VirtualServiceController
destinationRuleControllers map[string]DestinationRuleController
}
func Factory(ctx context.Context, config rest.Config) (context.Context, controller.Starter, error) {
c, err := NewForConfig(config)
if err != nil {
return ctx, nil, err
}
cs := NewClientsFromInterface(c)
ctx = context.WithValue(ctx, contextKeyType{}, c)
ctx = context.WithValue(ctx, contextClientsKeyType{}, cs)
return ctx, c, nil
}
func ClientsFrom(ctx context.Context) *Clients {
return ctx.Value(contextClientsKeyType{}).(*Clients)
}
func From(ctx context.Context) Interface {
return ctx.Value(contextKeyType{}).(Interface)
}
func NewClients(config rest.Config) (*Clients, error) {
iface, err := NewForConfig(config)
if err != nil {
return nil, err
}
return NewClientsFromInterface(iface), nil
}
func NewClientsFromInterface(iface Interface) *Clients {
return &Clients{
Interface: iface,
VirtualService: &virtualServiceClient2{
iface: iface.VirtualServices(""),
},
DestinationRule: &destinationRuleClient2{
iface: iface.DestinationRules(""),
},
}
}
func NewForConfig(config rest.Config) (Interface, error) {
if config.NegotiatedSerializer == nil {
config.NegotiatedSerializer = dynamic.NegotiatedSerializer
}
restClient, err := restwatch.UnversionedRESTClientFor(&config)
if err != nil {
return nil, err
}
return &Client{
restClient: restClient,
virtualServiceControllers: map[string]VirtualServiceController{},
destinationRuleControllers: map[string]DestinationRuleController{},
}, nil
}
func (c *Client) RESTClient() rest.Interface {
return c.restClient
}
func (c *Client) Sync(ctx context.Context) error {
return controller.Sync(ctx, c.starters...)
}
func (c *Client) Start(ctx context.Context, threadiness int) error {
return controller.Start(ctx, threadiness, c.starters...)
}
type VirtualServicesGetter interface {
VirtualServices(namespace string) VirtualServiceInterface
}
func (c *Client) VirtualServices(namespace string) VirtualServiceInterface {
objectClient := objectclient.NewObjectClient(namespace, c.restClient, &VirtualServiceResource, VirtualServiceGroupVersionKind, virtualServiceFactory{})
return &virtualServiceClient{
ns: namespace,
client: c,
objectClient: objectClient,
}
}
type DestinationRulesGetter interface {
DestinationRules(namespace string) DestinationRuleInterface
}
func (c *Client) DestinationRules(namespace string) DestinationRuleInterface {
objectClient := objectclient.NewObjectClient(namespace, c.restClient, &DestinationRuleResource, DestinationRuleGroupVersionKind, destinationRuleFactory{})
return &destinationRuleClient{
ns: namespace,
client: c,
objectClient: objectClient,
}
}

View File

@ -0,0 +1,42 @@
package v1alpha3
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
const (
GroupName = "networking.istio.io"
Version = "v1alpha3"
)
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: Version}
// Kind takes an unqualified kind and returns a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
return SchemeGroupVersion.WithKind(kind).GroupKind()
}
// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
return SchemeGroupVersion.WithResource(resource).GroupResource()
}
var (
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
AddToScheme = SchemeBuilder.AddToScheme
)
// Adds the list of known types to api.Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
// TODO this gets cleaned up when the types are fixed
scheme.AddKnownTypes(SchemeGroupVersion,
&VirtualServiceList{},
&DestinationRuleList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}

View File

@ -0,0 +1,506 @@
package v1alpha3
import (
"context"
"github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/norman/controller"
"github.com/rancher/norman/objectclient"
"github.com/rancher/norman/resource"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/tools/cache"
)
var (
VirtualServiceGroupVersionKind = schema.GroupVersionKind{
Version: Version,
Group: GroupName,
Kind: "VirtualService",
}
VirtualServiceResource = metav1.APIResource{
Name: "virtualservices",
SingularName: "virtualservice",
Namespaced: true,
Kind: VirtualServiceGroupVersionKind.Kind,
}
VirtualServiceGroupVersionResource = schema.GroupVersionResource{
Group: GroupName,
Version: Version,
Resource: "virtualservices",
}
)
func init() {
resource.Put(VirtualServiceGroupVersionResource)
}
func NewVirtualService(namespace, name string, obj v1alpha3.VirtualService) *v1alpha3.VirtualService {
obj.APIVersion, obj.Kind = VirtualServiceGroupVersionKind.ToAPIVersionAndKind()
obj.Name = name
obj.Namespace = namespace
return &obj
}
type VirtualServiceList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []v1alpha3.VirtualService `json:"items"`
}
type VirtualServiceHandlerFunc func(key string, obj *v1alpha3.VirtualService) (runtime.Object, error)
type VirtualServiceChangeHandlerFunc func(obj *v1alpha3.VirtualService) (runtime.Object, error)
type VirtualServiceLister interface {
List(namespace string, selector labels.Selector) (ret []*v1alpha3.VirtualService, err error)
Get(namespace, name string) (*v1alpha3.VirtualService, error)
}
type VirtualServiceController interface {
Generic() controller.GenericController
Informer() cache.SharedIndexInformer
Lister() VirtualServiceLister
AddHandler(ctx context.Context, name string, handler VirtualServiceHandlerFunc)
AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync VirtualServiceHandlerFunc)
AddClusterScopedHandler(ctx context.Context, name, clusterName string, handler VirtualServiceHandlerFunc)
AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, handler VirtualServiceHandlerFunc)
Enqueue(namespace, name string)
Sync(ctx context.Context) error
Start(ctx context.Context, threadiness int) error
}
type VirtualServiceInterface interface {
ObjectClient() *objectclient.ObjectClient
Create(*v1alpha3.VirtualService) (*v1alpha3.VirtualService, error)
GetNamespaced(namespace, name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error)
Get(name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error)
Update(*v1alpha3.VirtualService) (*v1alpha3.VirtualService, error)
Delete(name string, options *metav1.DeleteOptions) error
DeleteNamespaced(namespace, name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*VirtualServiceList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error
Controller() VirtualServiceController
AddHandler(ctx context.Context, name string, sync VirtualServiceHandlerFunc)
AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync VirtualServiceHandlerFunc)
AddLifecycle(ctx context.Context, name string, lifecycle VirtualServiceLifecycle)
AddFeatureLifecycle(ctx context.Context, enabled func() bool, name string, lifecycle VirtualServiceLifecycle)
AddClusterScopedHandler(ctx context.Context, name, clusterName string, sync VirtualServiceHandlerFunc)
AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, sync VirtualServiceHandlerFunc)
AddClusterScopedLifecycle(ctx context.Context, name, clusterName string, lifecycle VirtualServiceLifecycle)
AddClusterScopedFeatureLifecycle(ctx context.Context, enabled func() bool, name, clusterName string, lifecycle VirtualServiceLifecycle)
}
type virtualServiceLister struct {
controller *virtualServiceController
}
func (l *virtualServiceLister) List(namespace string, selector labels.Selector) (ret []*v1alpha3.VirtualService, err error) {
err = cache.ListAllByNamespace(l.controller.Informer().GetIndexer(), namespace, selector, func(obj interface{}) {
ret = append(ret, obj.(*v1alpha3.VirtualService))
})
return
}
func (l *virtualServiceLister) Get(namespace, name string) (*v1alpha3.VirtualService, error) {
var key string
if namespace != "" {
key = namespace + "/" + name
} else {
key = name
}
obj, exists, err := l.controller.Informer().GetIndexer().GetByKey(key)
if err != nil {
return nil, err
}
if !exists {
return nil, errors.NewNotFound(schema.GroupResource{
Group: VirtualServiceGroupVersionKind.Group,
Resource: "virtualService",
}, key)
}
return obj.(*v1alpha3.VirtualService), nil
}
type virtualServiceController struct {
controller.GenericController
}
func (c *virtualServiceController) Generic() controller.GenericController {
return c.GenericController
}
func (c *virtualServiceController) Lister() VirtualServiceLister {
return &virtualServiceLister{
controller: c,
}
}
func (c *virtualServiceController) AddHandler(ctx context.Context, name string, handler VirtualServiceHandlerFunc) {
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.VirtualService); ok {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *virtualServiceController) AddFeatureHandler(ctx context.Context, enabled func() bool, name string, handler VirtualServiceHandlerFunc) {
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if !enabled() {
return nil, nil
} else if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.VirtualService); ok {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *virtualServiceController) AddClusterScopedHandler(ctx context.Context, name, cluster string, handler VirtualServiceHandlerFunc) {
resource.PutClusterScoped(VirtualServiceGroupVersionResource)
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.VirtualService); ok && controller.ObjectInCluster(cluster, obj) {
return handler(key, v)
} else {
return nil, nil
}
})
}
func (c *virtualServiceController) AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, cluster string, handler VirtualServiceHandlerFunc) {
resource.PutClusterScoped(VirtualServiceGroupVersionResource)
c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) {
if !enabled() {
return nil, nil
} else if obj == nil {
return handler(key, nil)
} else if v, ok := obj.(*v1alpha3.VirtualService); ok && controller.ObjectInCluster(cluster, obj) {
return handler(key, v)
} else {
return nil, nil
}
})
}
type virtualServiceFactory struct {
}
func (c virtualServiceFactory) Object() runtime.Object {
return &v1alpha3.VirtualService{}
}
func (c virtualServiceFactory) List() runtime.Object {
return &VirtualServiceList{}
}
func (s *virtualServiceClient) Controller() VirtualServiceController {
s.client.Lock()
defer s.client.Unlock()
c, ok := s.client.virtualServiceControllers[s.ns]
if ok {
return c
}
genericController := controller.NewGenericController(VirtualServiceGroupVersionKind.Kind+"Controller",
s.objectClient)
c = &virtualServiceController{
GenericController: genericController,
}
s.client.virtualServiceControllers[s.ns] = c
s.client.starters = append(s.client.starters, c)
return c
}
type virtualServiceClient struct {
client *Client
ns string
objectClient *objectclient.ObjectClient
controller VirtualServiceController
}
func (s *virtualServiceClient) ObjectClient() *objectclient.ObjectClient {
return s.objectClient
}
func (s *virtualServiceClient) Create(o *v1alpha3.VirtualService) (*v1alpha3.VirtualService, error) {
obj, err := s.objectClient.Create(o)
return obj.(*v1alpha3.VirtualService), err
}
func (s *virtualServiceClient) Get(name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error) {
obj, err := s.objectClient.Get(name, opts)
return obj.(*v1alpha3.VirtualService), err
}
func (s *virtualServiceClient) GetNamespaced(namespace, name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error) {
obj, err := s.objectClient.GetNamespaced(namespace, name, opts)
return obj.(*v1alpha3.VirtualService), err
}
func (s *virtualServiceClient) Update(o *v1alpha3.VirtualService) (*v1alpha3.VirtualService, error) {
obj, err := s.objectClient.Update(o.Name, o)
return obj.(*v1alpha3.VirtualService), err
}
func (s *virtualServiceClient) Delete(name string, options *metav1.DeleteOptions) error {
return s.objectClient.Delete(name, options)
}
func (s *virtualServiceClient) DeleteNamespaced(namespace, name string, options *metav1.DeleteOptions) error {
return s.objectClient.DeleteNamespaced(namespace, name, options)
}
func (s *virtualServiceClient) List(opts metav1.ListOptions) (*VirtualServiceList, error) {
obj, err := s.objectClient.List(opts)
return obj.(*VirtualServiceList), err
}
func (s *virtualServiceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return s.objectClient.Watch(opts)
}
// Patch applies the patch and returns the patched deployment.
func (s *virtualServiceClient) Patch(o *v1alpha3.VirtualService, patchType types.PatchType, data []byte, subresources ...string) (*v1alpha3.VirtualService, error) {
obj, err := s.objectClient.Patch(o.Name, o, patchType, data, subresources...)
return obj.(*v1alpha3.VirtualService), err
}
func (s *virtualServiceClient) DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error {
return s.objectClient.DeleteCollection(deleteOpts, listOpts)
}
func (s *virtualServiceClient) AddHandler(ctx context.Context, name string, sync VirtualServiceHandlerFunc) {
s.Controller().AddHandler(ctx, name, sync)
}
func (s *virtualServiceClient) AddFeatureHandler(ctx context.Context, enabled func() bool, name string, sync VirtualServiceHandlerFunc) {
s.Controller().AddFeatureHandler(ctx, enabled, name, sync)
}
func (s *virtualServiceClient) AddLifecycle(ctx context.Context, name string, lifecycle VirtualServiceLifecycle) {
sync := NewVirtualServiceLifecycleAdapter(name, false, s, lifecycle)
s.Controller().AddHandler(ctx, name, sync)
}
func (s *virtualServiceClient) AddFeatureLifecycle(ctx context.Context, enabled func() bool, name string, lifecycle VirtualServiceLifecycle) {
sync := NewVirtualServiceLifecycleAdapter(name, false, s, lifecycle)
s.Controller().AddFeatureHandler(ctx, enabled, name, sync)
}
func (s *virtualServiceClient) AddClusterScopedHandler(ctx context.Context, name, clusterName string, sync VirtualServiceHandlerFunc) {
s.Controller().AddClusterScopedHandler(ctx, name, clusterName, sync)
}
func (s *virtualServiceClient) AddClusterScopedFeatureHandler(ctx context.Context, enabled func() bool, name, clusterName string, sync VirtualServiceHandlerFunc) {
s.Controller().AddClusterScopedFeatureHandler(ctx, enabled, name, clusterName, sync)
}
func (s *virtualServiceClient) AddClusterScopedLifecycle(ctx context.Context, name, clusterName string, lifecycle VirtualServiceLifecycle) {
sync := NewVirtualServiceLifecycleAdapter(name+"_"+clusterName, true, s, lifecycle)
s.Controller().AddClusterScopedHandler(ctx, name, clusterName, sync)
}
func (s *virtualServiceClient) AddClusterScopedFeatureLifecycle(ctx context.Context, enabled func() bool, name, clusterName string, lifecycle VirtualServiceLifecycle) {
sync := NewVirtualServiceLifecycleAdapter(name+"_"+clusterName, true, s, lifecycle)
s.Controller().AddClusterScopedFeatureHandler(ctx, enabled, name, clusterName, sync)
}
type VirtualServiceIndexer func(obj *v1alpha3.VirtualService) ([]string, error)
type VirtualServiceClientCache interface {
Get(namespace, name string) (*v1alpha3.VirtualService, error)
List(namespace string, selector labels.Selector) ([]*v1alpha3.VirtualService, error)
Index(name string, indexer VirtualServiceIndexer)
GetIndexed(name, key string) ([]*v1alpha3.VirtualService, error)
}
type VirtualServiceClient interface {
Create(*v1alpha3.VirtualService) (*v1alpha3.VirtualService, error)
Get(namespace, name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error)
Update(*v1alpha3.VirtualService) (*v1alpha3.VirtualService, error)
Delete(namespace, name string, options *metav1.DeleteOptions) error
List(namespace string, opts metav1.ListOptions) (*VirtualServiceList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
Cache() VirtualServiceClientCache
OnCreate(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc)
OnChange(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc)
OnRemove(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc)
Enqueue(namespace, name string)
Generic() controller.GenericController
ObjectClient() *objectclient.ObjectClient
Interface() VirtualServiceInterface
}
type virtualServiceClientCache struct {
client *virtualServiceClient2
}
type virtualServiceClient2 struct {
iface VirtualServiceInterface
controller VirtualServiceController
}
func (n *virtualServiceClient2) Interface() VirtualServiceInterface {
return n.iface
}
func (n *virtualServiceClient2) Generic() controller.GenericController {
return n.iface.Controller().Generic()
}
func (n *virtualServiceClient2) ObjectClient() *objectclient.ObjectClient {
return n.Interface().ObjectClient()
}
func (n *virtualServiceClient2) Enqueue(namespace, name string) {
n.iface.Controller().Enqueue(namespace, name)
}
func (n *virtualServiceClient2) Create(obj *v1alpha3.VirtualService) (*v1alpha3.VirtualService, error) {
return n.iface.Create(obj)
}
func (n *virtualServiceClient2) Get(namespace, name string, opts metav1.GetOptions) (*v1alpha3.VirtualService, error) {
return n.iface.GetNamespaced(namespace, name, opts)
}
func (n *virtualServiceClient2) Update(obj *v1alpha3.VirtualService) (*v1alpha3.VirtualService, error) {
return n.iface.Update(obj)
}
func (n *virtualServiceClient2) Delete(namespace, name string, options *metav1.DeleteOptions) error {
return n.iface.DeleteNamespaced(namespace, name, options)
}
func (n *virtualServiceClient2) List(namespace string, opts metav1.ListOptions) (*VirtualServiceList, error) {
return n.iface.List(opts)
}
func (n *virtualServiceClient2) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return n.iface.Watch(opts)
}
func (n *virtualServiceClientCache) Get(namespace, name string) (*v1alpha3.VirtualService, error) {
return n.client.controller.Lister().Get(namespace, name)
}
func (n *virtualServiceClientCache) List(namespace string, selector labels.Selector) ([]*v1alpha3.VirtualService, error) {
return n.client.controller.Lister().List(namespace, selector)
}
func (n *virtualServiceClient2) Cache() VirtualServiceClientCache {
n.loadController()
return &virtualServiceClientCache{
client: n,
}
}
func (n *virtualServiceClient2) OnCreate(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name+"-create", &virtualServiceLifecycleDelegate{create: sync})
}
func (n *virtualServiceClient2) OnChange(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name+"-change", &virtualServiceLifecycleDelegate{update: sync})
}
func (n *virtualServiceClient2) OnRemove(ctx context.Context, name string, sync VirtualServiceChangeHandlerFunc) {
n.loadController()
n.iface.AddLifecycle(ctx, name, &virtualServiceLifecycleDelegate{remove: sync})
}
func (n *virtualServiceClientCache) Index(name string, indexer VirtualServiceIndexer) {
err := n.client.controller.Informer().GetIndexer().AddIndexers(map[string]cache.IndexFunc{
name: func(obj interface{}) ([]string, error) {
if v, ok := obj.(*v1alpha3.VirtualService); ok {
return indexer(v)
}
return nil, nil
},
})
if err != nil {
panic(err)
}
}
func (n *virtualServiceClientCache) GetIndexed(name, key string) ([]*v1alpha3.VirtualService, error) {
var result []*v1alpha3.VirtualService
objs, err := n.client.controller.Informer().GetIndexer().ByIndex(name, key)
if err != nil {
return nil, err
}
for _, obj := range objs {
if v, ok := obj.(*v1alpha3.VirtualService); ok {
result = append(result, v)
}
}
return result, nil
}
func (n *virtualServiceClient2) loadController() {
if n.controller == nil {
n.controller = n.iface.Controller()
}
}
type virtualServiceLifecycleDelegate struct {
create VirtualServiceChangeHandlerFunc
update VirtualServiceChangeHandlerFunc
remove VirtualServiceChangeHandlerFunc
}
func (n *virtualServiceLifecycleDelegate) HasCreate() bool {
return n.create != nil
}
func (n *virtualServiceLifecycleDelegate) Create(obj *v1alpha3.VirtualService) (runtime.Object, error) {
if n.create == nil {
return obj, nil
}
return n.create(obj)
}
func (n *virtualServiceLifecycleDelegate) HasFinalize() bool {
return n.remove != nil
}
func (n *virtualServiceLifecycleDelegate) Remove(obj *v1alpha3.VirtualService) (runtime.Object, error) {
if n.remove == nil {
return obj, nil
}
return n.remove(obj)
}
func (n *virtualServiceLifecycleDelegate) Updated(obj *v1alpha3.VirtualService) (runtime.Object, error) {
if n.update == nil {
return obj, nil
}
return n.update(obj)
}

View File

@ -0,0 +1,63 @@
package v1alpha3
import (
"github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/norman/lifecycle"
"k8s.io/apimachinery/pkg/runtime"
)
type VirtualServiceLifecycle interface {
Create(obj *v1alpha3.VirtualService) (runtime.Object, error)
Remove(obj *v1alpha3.VirtualService) (runtime.Object, error)
Updated(obj *v1alpha3.VirtualService) (runtime.Object, error)
}
type virtualServiceLifecycleAdapter struct {
lifecycle VirtualServiceLifecycle
}
func (w *virtualServiceLifecycleAdapter) HasCreate() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasCreate()
}
func (w *virtualServiceLifecycleAdapter) HasFinalize() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasFinalize()
}
func (w *virtualServiceLifecycleAdapter) Create(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Create(obj.(*v1alpha3.VirtualService))
if o == nil {
return nil, err
}
return o, err
}
func (w *virtualServiceLifecycleAdapter) Finalize(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Remove(obj.(*v1alpha3.VirtualService))
if o == nil {
return nil, err
}
return o, err
}
func (w *virtualServiceLifecycleAdapter) Updated(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Updated(obj.(*v1alpha3.VirtualService))
if o == nil {
return nil, err
}
return o, err
}
func NewVirtualServiceLifecycleAdapter(name string, clusterScoped bool, client VirtualServiceInterface, l VirtualServiceLifecycle) VirtualServiceHandlerFunc {
adapter := &virtualServiceLifecycleAdapter{lifecycle: l}
syncFn := lifecycle.NewObjectLifecycleAdapter(name, clusterScoped, adapter, client.ObjectClient())
return func(key string, obj *v1alpha3.VirtualService) (runtime.Object, error) {
newObj, err := syncFn(key, obj)
if o, ok := newObj.(runtime.Object); ok {
return o, err
}
return nil, err
}
}

View File

@ -4,6 +4,7 @@ import (
"net/http"
monitoringv1 "github.com/coreos/prometheus-operator/pkg/client/monitoring/v1"
istiov1alpha3 "github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/norman/types"
m "github.com/rancher/norman/types/mapper"
v3 "github.com/rancher/types/apis/project.cattle.io/v3"
@ -46,7 +47,8 @@ var (
Init(appTypes).
Init(pipelineTypes).
Init(monitoringTypes).
Init(autoscalingTypes)
Init(autoscalingTypes).
Init(istioTypes)
)
func configMapTypes(schemas *types.Schemas) *types.Schemas {
@ -1088,3 +1090,19 @@ func autoscalingTypes(schemas *types.Schemas) *types.Schemas {
Description string `json:"description,omitempty"`
}{})
}
func istioTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
MustImport(&Version, istiov1alpha3.HTTPMatchRequest{}, struct {
Port *uint32 `json:"port,omitempty"`
}{}).
MustImport(&Version, istiov1alpha3.HTTPRoute{}, struct {
WebsocketUpgrade *bool `json:"websocketUpgrade,omitempty"`
}{}).
MustImport(&Version, istiov1alpha3.VirtualService{}, projectOverride{}, struct {
Status interface{}
}{}).
MustImport(&Version, istiov1alpha3.DestinationRule{}, projectOverride{}, struct {
Status interface{}
}{})
}

View File

@ -47,6 +47,8 @@ type Client struct {
PrometheusRule PrometheusRuleOperations
Alertmanager AlertmanagerOperations
HorizontalPodAutoscaler HorizontalPodAutoscalerOperations
VirtualService VirtualServiceOperations
DestinationRule DestinationRuleOperations
}
func NewClient(opts *clientbase.ClientOpts) (*Client, error) {
@ -99,6 +101,8 @@ func NewClient(opts *clientbase.ClientOpts) (*Client, error) {
client.PrometheusRule = newPrometheusRuleClient(client)
client.Alertmanager = newAlertmanagerClient(client)
client.HorizontalPodAutoscaler = newHorizontalPodAutoscalerClient(client)
client.VirtualService = newVirtualServiceClient(client)
client.DestinationRule = newDestinationRuleClient(client)
return client, nil
}

View File

@ -0,0 +1,12 @@
package client
const (
ConnectionPoolSettingsType = "connectionPoolSettings"
ConnectionPoolSettingsFieldHTTP = "http"
ConnectionPoolSettingsFieldTCP = "tcp"
)
type ConnectionPoolSettings struct {
HTTP *HTTPSettings `json:"http,omitempty" yaml:"http,omitempty"`
TCP *TCPSettings `json:"tcp,omitempty" yaml:"tcp,omitempty"`
}

View File

@ -0,0 +1,16 @@
package client
const (
ConsistentHashLBType = "consistentHashLB"
ConsistentHashLBFieldHTTPCookie = "httpCookie"
ConsistentHashLBFieldHTTPHeaderName = "httpHeaderName"
ConsistentHashLBFieldMinimumRingSize = "minimumRingSize"
ConsistentHashLBFieldUseSourceIP = "useSourceIp"
)
type ConsistentHashLB struct {
HTTPCookie *HTTPCookie `json:"httpCookie,omitempty" yaml:"httpCookie,omitempty"`
HTTPHeaderName string `json:"httpHeaderName,omitempty" yaml:"httpHeaderName,omitempty"`
MinimumRingSize int64 `json:"minimumRingSize,omitempty" yaml:"minimumRingSize,omitempty"`
UseSourceIP bool `json:"useSourceIp,omitempty" yaml:"useSourceIp,omitempty"`
}

View File

@ -0,0 +1,20 @@
package client
const (
CorsPolicyType = "corsPolicy"
CorsPolicyFieldAllowCredentials = "allowCredentials"
CorsPolicyFieldAllowHeaders = "allowHeaders"
CorsPolicyFieldAllowMethods = "allowMethods"
CorsPolicyFieldAllowOrigin = "allowOrigin"
CorsPolicyFieldExposeHeaders = "exposeHeaders"
CorsPolicyFieldMaxAge = "maxAge"
)
type CorsPolicy struct {
AllowCredentials bool `json:"allowCredentials,omitempty" yaml:"allowCredentials,omitempty"`
AllowHeaders []string `json:"allowHeaders,omitempty" yaml:"allowHeaders,omitempty"`
AllowMethods []string `json:"allowMethods,omitempty" yaml:"allowMethods,omitempty"`
AllowOrigin []string `json:"allowOrigin,omitempty" yaml:"allowOrigin,omitempty"`
ExposeHeaders []string `json:"exposeHeaders,omitempty" yaml:"exposeHeaders,omitempty"`
MaxAge string `json:"maxAge,omitempty" yaml:"maxAge,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
DestinationType = "destination"
DestinationFieldHost = "host"
DestinationFieldPort = "port"
DestinationFieldSubset = "subset"
)
type Destination struct {
Host string `json:"host,omitempty" yaml:"host,omitempty"`
Port *PortSelector `json:"port,omitempty" yaml:"port,omitempty"`
Subset string `json:"subset,omitempty" yaml:"subset,omitempty"`
}

View File

@ -0,0 +1,117 @@
package client
import (
"github.com/rancher/norman/types"
)
const (
DestinationRuleType = "destinationRule"
DestinationRuleFieldAnnotations = "annotations"
DestinationRuleFieldCreated = "created"
DestinationRuleFieldCreatorID = "creatorId"
DestinationRuleFieldHost = "host"
DestinationRuleFieldLabels = "labels"
DestinationRuleFieldName = "name"
DestinationRuleFieldNamespaceId = "namespaceId"
DestinationRuleFieldOwnerReferences = "ownerReferences"
DestinationRuleFieldProjectID = "projectId"
DestinationRuleFieldRemoved = "removed"
DestinationRuleFieldState = "state"
DestinationRuleFieldStatus = "status"
DestinationRuleFieldSubsets = "subsets"
DestinationRuleFieldTrafficPolicy = "trafficPolicy"
DestinationRuleFieldTransitioning = "transitioning"
DestinationRuleFieldTransitioningMessage = "transitioningMessage"
DestinationRuleFieldUUID = "uuid"
)
type DestinationRule struct {
types.Resource
Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"`
Created string `json:"created,omitempty" yaml:"created,omitempty"`
CreatorID string `json:"creatorId,omitempty" yaml:"creatorId,omitempty"`
Host string `json:"host,omitempty" yaml:"host,omitempty"`
Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
NamespaceId string `json:"namespaceId,omitempty" yaml:"namespaceId,omitempty"`
OwnerReferences []OwnerReference `json:"ownerReferences,omitempty" yaml:"ownerReferences,omitempty"`
ProjectID string `json:"projectId,omitempty" yaml:"projectId,omitempty"`
Removed string `json:"removed,omitempty" yaml:"removed,omitempty"`
State string `json:"state,omitempty" yaml:"state,omitempty"`
Status interface{} `json:"status,omitempty" yaml:"status,omitempty"`
Subsets []Subset `json:"subsets,omitempty" yaml:"subsets,omitempty"`
TrafficPolicy *TrafficPolicy `json:"trafficPolicy,omitempty" yaml:"trafficPolicy,omitempty"`
Transitioning string `json:"transitioning,omitempty" yaml:"transitioning,omitempty"`
TransitioningMessage string `json:"transitioningMessage,omitempty" yaml:"transitioningMessage,omitempty"`
UUID string `json:"uuid,omitempty" yaml:"uuid,omitempty"`
}
type DestinationRuleCollection struct {
types.Collection
Data []DestinationRule `json:"data,omitempty"`
client *DestinationRuleClient
}
type DestinationRuleClient struct {
apiClient *Client
}
type DestinationRuleOperations interface {
List(opts *types.ListOpts) (*DestinationRuleCollection, error)
Create(opts *DestinationRule) (*DestinationRule, error)
Update(existing *DestinationRule, updates interface{}) (*DestinationRule, error)
Replace(existing *DestinationRule) (*DestinationRule, error)
ByID(id string) (*DestinationRule, error)
Delete(container *DestinationRule) error
}
func newDestinationRuleClient(apiClient *Client) *DestinationRuleClient {
return &DestinationRuleClient{
apiClient: apiClient,
}
}
func (c *DestinationRuleClient) Create(container *DestinationRule) (*DestinationRule, error) {
resp := &DestinationRule{}
err := c.apiClient.Ops.DoCreate(DestinationRuleType, container, resp)
return resp, err
}
func (c *DestinationRuleClient) Update(existing *DestinationRule, updates interface{}) (*DestinationRule, error) {
resp := &DestinationRule{}
err := c.apiClient.Ops.DoUpdate(DestinationRuleType, &existing.Resource, updates, resp)
return resp, err
}
func (c *DestinationRuleClient) Replace(obj *DestinationRule) (*DestinationRule, error) {
resp := &DestinationRule{}
err := c.apiClient.Ops.DoReplace(DestinationRuleType, &obj.Resource, obj, resp)
return resp, err
}
func (c *DestinationRuleClient) List(opts *types.ListOpts) (*DestinationRuleCollection, error) {
resp := &DestinationRuleCollection{}
err := c.apiClient.Ops.DoList(DestinationRuleType, opts, resp)
resp.client = c
return resp, err
}
func (cc *DestinationRuleCollection) Next() (*DestinationRuleCollection, error) {
if cc != nil && cc.Pagination != nil && cc.Pagination.Next != "" {
resp := &DestinationRuleCollection{}
err := cc.client.apiClient.Ops.DoNext(cc.Pagination.Next, resp)
resp.client = cc.client
return resp, err
}
return nil, nil
}
func (c *DestinationRuleClient) ByID(id string) (*DestinationRule, error) {
resp := &DestinationRule{}
err := c.apiClient.Ops.DoByID(DestinationRuleType, id, resp)
return resp, err
}
func (c *DestinationRuleClient) Delete(container *DestinationRule) error {
return c.apiClient.Ops.DoResourceDelete(DestinationRuleType, &container.Resource)
}

View File

@ -0,0 +1,14 @@
package client
const (
DestinationRuleSpecType = "destinationRuleSpec"
DestinationRuleSpecFieldHost = "host"
DestinationRuleSpecFieldSubsets = "subsets"
DestinationRuleSpecFieldTrafficPolicy = "trafficPolicy"
)
type DestinationRuleSpec struct {
Host string `json:"host,omitempty" yaml:"host,omitempty"`
Subsets []Subset `json:"subsets,omitempty" yaml:"subsets,omitempty"`
TrafficPolicy *TrafficPolicy `json:"trafficPolicy,omitempty" yaml:"trafficPolicy,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
HeaderOperationsType = "headerOperations"
HeaderOperationsFieldAdd = "add"
HeaderOperationsFieldRemove = "remove"
HeaderOperationsFieldSet = "set"
)
type HeaderOperations struct {
Add map[string]string `json:"add,omitempty" yaml:"add,omitempty"`
Remove []string `json:"remove,omitempty" yaml:"remove,omitempty"`
Set map[string]string `json:"set,omitempty" yaml:"set,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
HeadersType = "headers"
HeadersFieldRequest = "request"
HeadersFieldResponse = "response"
)
type Headers struct {
Request *HeaderOperations `json:"request,omitempty" yaml:"request,omitempty"`
Response *HeaderOperations `json:"response,omitempty" yaml:"response,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
HTTPCookieType = "httpCookie"
HTTPCookieFieldName = "name"
HTTPCookieFieldPath = "path"
HTTPCookieFieldTTL = "ttl"
)
type HTTPCookie struct {
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Path string `json:"path,omitempty" yaml:"path,omitempty"`
TTL string `json:"ttl,omitempty" yaml:"ttl,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
HTTPFaultInjectionType = "httpFaultInjection"
HTTPFaultInjectionFieldAbort = "abort"
HTTPFaultInjectionFieldDelay = "delay"
)
type HTTPFaultInjection struct {
Abort *InjectAbort `json:"abort,omitempty" yaml:"abort,omitempty"`
Delay *InjectDelay `json:"delay,omitempty" yaml:"delay,omitempty"`
}

View File

@ -0,0 +1,24 @@
package client
const (
HTTPMatchRequestType = "httpMatchRequest"
HTTPMatchRequestFieldAuthority = "authority"
HTTPMatchRequestFieldGateways = "gateways"
HTTPMatchRequestFieldHeaders = "headers"
HTTPMatchRequestFieldMethod = "method"
HTTPMatchRequestFieldPort = "port"
HTTPMatchRequestFieldScheme = "scheme"
HTTPMatchRequestFieldSourceLabels = "sourceLabels"
HTTPMatchRequestFieldURI = "uri"
)
type HTTPMatchRequest struct {
Authority *StringMatch `json:"authority,omitempty" yaml:"authority,omitempty"`
Gateways []string `json:"gateways,omitempty" yaml:"gateways,omitempty"`
Headers map[string]StringMatch `json:"headers,omitempty" yaml:"headers,omitempty"`
Method *StringMatch `json:"method,omitempty" yaml:"method,omitempty"`
Port *int64 `json:"port,omitempty" yaml:"port,omitempty"`
Scheme *StringMatch `json:"scheme,omitempty" yaml:"scheme,omitempty"`
SourceLabels map[string]string `json:"sourceLabels,omitempty" yaml:"sourceLabels,omitempty"`
URI *StringMatch `json:"uri,omitempty" yaml:"uri,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
HTTPRedirectType = "httpRedirect"
HTTPRedirectFieldAuthority = "authority"
HTTPRedirectFieldURI = "uri"
)
type HTTPRedirect struct {
Authority string `json:"authority,omitempty" yaml:"authority,omitempty"`
URI string `json:"uri,omitempty" yaml:"uri,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
HTTPRetryType = "httpRetry"
HTTPRetryFieldAttempts = "attempts"
HTTPRetryFieldPerTryTimeout = "perTryTimeout"
)
type HTTPRetry struct {
Attempts int64 `json:"attempts,omitempty" yaml:"attempts,omitempty"`
PerTryTimeout string `json:"perTryTimeout,omitempty" yaml:"perTryTimeout,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
HTTPRewriteType = "httpRewrite"
HTTPRewriteFieldAuthority = "authority"
HTTPRewriteFieldURI = "uri"
)
type HTTPRewrite struct {
Authority string `json:"authority,omitempty" yaml:"authority,omitempty"`
URI string `json:"uri,omitempty" yaml:"uri,omitempty"`
}

View File

@ -0,0 +1,34 @@
package client
const (
HTTPRouteType = "httpRoute"
HTTPRouteFieldCorsPolicy = "corsPolicy"
HTTPRouteFieldDeprecatedAppendHeaders = "appendHeaders"
HTTPRouteFieldFault = "fault"
HTTPRouteFieldHeaders = "headers"
HTTPRouteFieldMatch = "match"
HTTPRouteFieldMirror = "mirror"
HTTPRouteFieldRedirect = "redirect"
HTTPRouteFieldRemoveResponseHeaders = "removeResponseHeaders"
HTTPRouteFieldRetries = "retries"
HTTPRouteFieldRewrite = "rewrite"
HTTPRouteFieldRoute = "route"
HTTPRouteFieldTimeout = "timeout"
HTTPRouteFieldWebsocketUpgrade = "websocketUpgrade"
)
type HTTPRoute struct {
CorsPolicy *CorsPolicy `json:"corsPolicy,omitempty" yaml:"corsPolicy,omitempty"`
DeprecatedAppendHeaders map[string]string `json:"appendHeaders,omitempty" yaml:"appendHeaders,omitempty"`
Fault *HTTPFaultInjection `json:"fault,omitempty" yaml:"fault,omitempty"`
Headers *Headers `json:"headers,omitempty" yaml:"headers,omitempty"`
Match []HTTPMatchRequest `json:"match,omitempty" yaml:"match,omitempty"`
Mirror *Destination `json:"mirror,omitempty" yaml:"mirror,omitempty"`
Redirect *HTTPRedirect `json:"redirect,omitempty" yaml:"redirect,omitempty"`
RemoveResponseHeaders map[string]string `json:"removeResponseHeaders,omitempty" yaml:"removeResponseHeaders,omitempty"`
Retries *HTTPRetry `json:"retries,omitempty" yaml:"retries,omitempty"`
Rewrite *HTTPRewrite `json:"rewrite,omitempty" yaml:"rewrite,omitempty"`
Route []HTTPRouteDestination `json:"route,omitempty" yaml:"route,omitempty"`
Timeout string `json:"timeout,omitempty" yaml:"timeout,omitempty"`
WebsocketUpgrade *bool `json:"websocketUpgrade,omitempty" yaml:"websocketUpgrade,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
HTTPRouteDestinationType = "httpRouteDestination"
HTTPRouteDestinationFieldDestination = "destination"
HTTPRouteDestinationFieldHeaders = "headers"
HTTPRouteDestinationFieldWeight = "weight"
)
type HTTPRouteDestination struct {
Destination *Destination `json:"destination,omitempty" yaml:"destination,omitempty"`
Headers *Headers `json:"headers,omitempty" yaml:"headers,omitempty"`
Weight int64 `json:"weight,omitempty" yaml:"weight,omitempty"`
}

View File

@ -0,0 +1,16 @@
package client
const (
HTTPSettingsType = "httpSettings"
HTTPSettingsFieldHTTP1MaxPendingRequests = "http1MaxPendingRequests"
HTTPSettingsFieldHTTP2MaxRequests = "http2MaxRequests"
HTTPSettingsFieldMaxRequestsPerConnection = "maxRequestsPerConnection"
HTTPSettingsFieldMaxRetries = "maxRetries"
)
type HTTPSettings struct {
HTTP1MaxPendingRequests int64 `json:"http1MaxPendingRequests,omitempty" yaml:"http1MaxPendingRequests,omitempty"`
HTTP2MaxRequests int64 `json:"http2MaxRequests,omitempty" yaml:"http2MaxRequests,omitempty"`
MaxRequestsPerConnection int64 `json:"maxRequestsPerConnection,omitempty" yaml:"maxRequestsPerConnection,omitempty"`
MaxRetries int64 `json:"maxRetries,omitempty" yaml:"maxRetries,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
InjectAbortType = "injectAbort"
InjectAbortFieldHTTPStatus = "httpStatus"
InjectAbortFieldPercent = "percent"
)
type InjectAbort struct {
HTTPStatus int64 `json:"httpStatus,omitempty" yaml:"httpStatus,omitempty"`
Percent int64 `json:"percent,omitempty" yaml:"percent,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
InjectDelayType = "injectDelay"
InjectDelayFieldExponentialDelay = "exponentialDelay"
InjectDelayFieldFixedDelay = "fixedDelay"
InjectDelayFieldPercent = "percent"
)
type InjectDelay struct {
ExponentialDelay string `json:"exponentialDelay,omitempty" yaml:"exponentialDelay,omitempty"`
FixedDelay string `json:"fixedDelay,omitempty" yaml:"fixedDelay,omitempty"`
Percent int64 `json:"percent,omitempty" yaml:"percent,omitempty"`
}

View File

@ -0,0 +1,16 @@
package client
const (
L4MatchAttributesType = "l4MatchAttributes"
L4MatchAttributesFieldDestinationSubnets = "destinationSubnets"
L4MatchAttributesFieldGateways = "gateways"
L4MatchAttributesFieldPort = "port"
L4MatchAttributesFieldSourceLabels = "sourceLabels"
)
type L4MatchAttributes struct {
DestinationSubnets []string `json:"destinationSubnets,omitempty" yaml:"destinationSubnets,omitempty"`
Gateways []string `json:"gateways,omitempty" yaml:"gateways,omitempty"`
Port int64 `json:"port,omitempty" yaml:"port,omitempty"`
SourceLabels map[string]string `json:"sourceLabels,omitempty" yaml:"sourceLabels,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
LoadBalancerSettingsType = "loadBalancerSettings"
LoadBalancerSettingsFieldConsistentHash = "consistentHash"
LoadBalancerSettingsFieldSimple = "simple"
)
type LoadBalancerSettings struct {
ConsistentHash *ConsistentHashLB `json:"consistentHash,omitempty" yaml:"consistentHash,omitempty"`
Simple string `json:"simple,omitempty" yaml:"simple,omitempty"`
}

View File

@ -0,0 +1,16 @@
package client
const (
OutlierDetectionType = "outlierDetection"
OutlierDetectionFieldBaseEjectionTime = "baseEjectionTime"
OutlierDetectionFieldConsecutiveErrors = "consecutiveErrors"
OutlierDetectionFieldInterval = "interval"
OutlierDetectionFieldMaxEjectionPercent = "maxEjectionPercent"
)
type OutlierDetection struct {
BaseEjectionTime string `json:"baseEjectionTime,omitempty" yaml:"baseEjectionTime,omitempty"`
ConsecutiveErrors int64 `json:"consecutiveErrors,omitempty" yaml:"consecutiveErrors,omitempty"`
Interval string `json:"interval,omitempty" yaml:"interval,omitempty"`
MaxEjectionPercent int64 `json:"maxEjectionPercent,omitempty" yaml:"maxEjectionPercent,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
PortSelectorType = "portSelector"
PortSelectorFieldName = "name"
PortSelectorFieldNumber = "number"
)
type PortSelector struct {
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Number int64 `json:"number,omitempty" yaml:"number,omitempty"`
}

View File

@ -0,0 +1,18 @@
package client
const (
PortTrafficPolicyType = "portTrafficPolicy"
PortTrafficPolicyFieldConnectionPool = "connectionPool"
PortTrafficPolicyFieldLoadBalancer = "loadBalancer"
PortTrafficPolicyFieldOutlierDetection = "outlierDetection"
PortTrafficPolicyFieldPort = "port"
PortTrafficPolicyFieldTLS = "tls"
)
type PortTrafficPolicy struct {
ConnectionPool *ConnectionPoolSettings `json:"connectionPool,omitempty" yaml:"connectionPool,omitempty"`
LoadBalancer *LoadBalancerSettings `json:"loadBalancer,omitempty" yaml:"loadBalancer,omitempty"`
OutlierDetection *OutlierDetection `json:"outlierDetection,omitempty" yaml:"outlierDetection,omitempty"`
Port *PortSelector `json:"port,omitempty" yaml:"port,omitempty"`
TLS *TLSSettings `json:"tls,omitempty" yaml:"tls,omitempty"`
}

View File

@ -0,0 +1,16 @@
package client
const (
StringMatchType = "stringMatch"
StringMatchFieldExact = "exact"
StringMatchFieldPrefix = "prefix"
StringMatchFieldRegex = "regex"
StringMatchFieldSuffix = "suffix"
)
type StringMatch struct {
Exact string `json:"exact,omitempty" yaml:"exact,omitempty"`
Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
Regex string `json:"regex,omitempty" yaml:"regex,omitempty"`
Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"`
}

View File

@ -0,0 +1,14 @@
package client
const (
SubsetType = "subset"
SubsetFieldLabels = "labels"
SubsetFieldName = "name"
SubsetFieldTrafficPolicy = "trafficPolicy"
)
type Subset struct {
Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
TrafficPolicy *TrafficPolicy `json:"trafficPolicy,omitempty" yaml:"trafficPolicy,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
TCPRouteType = "tcpRoute"
TCPRouteFieldMatch = "match"
TCPRouteFieldRoute = "route"
)
type TCPRoute struct {
Match []L4MatchAttributes `json:"match,omitempty" yaml:"match,omitempty"`
Route []HTTPRouteDestination `json:"route,omitempty" yaml:"route,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
TCPSettingsType = "tcpSettings"
TCPSettingsFieldConnectTimeout = "connectTimeout"
TCPSettingsFieldMaxConnections = "maxConnections"
)
type TCPSettings struct {
ConnectTimeout string `json:"connectTimeout,omitempty" yaml:"connectTimeout,omitempty"`
MaxConnections int64 `json:"maxConnections,omitempty" yaml:"maxConnections,omitempty"`
}

View File

@ -0,0 +1,18 @@
package client
const (
TLSMatchAttributesType = "tlsMatchAttributes"
TLSMatchAttributesFieldDestinationSubnets = "destinationSubnets"
TLSMatchAttributesFieldGateways = "gateways"
TLSMatchAttributesFieldPort = "port"
TLSMatchAttributesFieldSniHosts = "sniHosts"
TLSMatchAttributesFieldSourceLabels = "sourceLabels"
)
type TLSMatchAttributes struct {
DestinationSubnets []string `json:"destinationSubnets,omitempty" yaml:"destinationSubnets,omitempty"`
Gateways []string `json:"gateways,omitempty" yaml:"gateways,omitempty"`
Port int64 `json:"port,omitempty" yaml:"port,omitempty"`
SniHosts []string `json:"sniHosts,omitempty" yaml:"sniHosts,omitempty"`
SourceLabels map[string]string `json:"sourceLabels,omitempty" yaml:"sourceLabels,omitempty"`
}

View File

@ -0,0 +1,12 @@
package client
const (
TLSRouteType = "tlsRoute"
TLSRouteFieldMatch = "match"
TLSRouteFieldRoute = "route"
)
type TLSRoute struct {
Match []TLSMatchAttributes `json:"match,omitempty" yaml:"match,omitempty"`
Route []HTTPRouteDestination `json:"route,omitempty" yaml:"route,omitempty"`
}

View File

@ -0,0 +1,20 @@
package client
const (
TLSSettingsType = "tlsSettings"
TLSSettingsFieldCaCertificates = "caCertificates"
TLSSettingsFieldClientCertificate = "clientCertificate"
TLSSettingsFieldMode = "mode"
TLSSettingsFieldPrivateKey = "privateKey"
TLSSettingsFieldSni = "sni"
TLSSettingsFieldSubjectAltNames = "subjectAltNames"
)
type TLSSettings struct {
CaCertificates string `json:"caCertificates,omitempty" yaml:"caCertificates,omitempty"`
ClientCertificate string `json:"clientCertificate,omitempty" yaml:"clientCertificate,omitempty"`
Mode string `json:"mode,omitempty" yaml:"mode,omitempty"`
PrivateKey string `json:"privateKey,omitempty" yaml:"privateKey,omitempty"`
Sni string `json:"sni,omitempty" yaml:"sni,omitempty"`
SubjectAltNames []string `json:"subjectAltNames,omitempty" yaml:"subjectAltNames,omitempty"`
}

View File

@ -0,0 +1,18 @@
package client
const (
TrafficPolicyType = "trafficPolicy"
TrafficPolicyFieldConnectionPool = "connectionPool"
TrafficPolicyFieldLoadBalancer = "loadBalancer"
TrafficPolicyFieldOutlierDetection = "outlierDetection"
TrafficPolicyFieldPortLevelSettings = "portLevelSettings"
TrafficPolicyFieldTLS = "tls"
)
type TrafficPolicy struct {
ConnectionPool *ConnectionPoolSettings `json:"connectionPool,omitempty" yaml:"connectionPool,omitempty"`
LoadBalancer *LoadBalancerSettings `json:"loadBalancer,omitempty" yaml:"loadBalancer,omitempty"`
OutlierDetection *OutlierDetection `json:"outlierDetection,omitempty" yaml:"outlierDetection,omitempty"`
PortLevelSettings []PortTrafficPolicy `json:"portLevelSettings,omitempty" yaml:"portLevelSettings,omitempty"`
TLS *TLSSettings `json:"tls,omitempty" yaml:"tls,omitempty"`
}

View File

@ -0,0 +1,121 @@
package client
import (
"github.com/rancher/norman/types"
)
const (
VirtualServiceType = "virtualService"
VirtualServiceFieldAnnotations = "annotations"
VirtualServiceFieldCreated = "created"
VirtualServiceFieldCreatorID = "creatorId"
VirtualServiceFieldGateways = "gateways"
VirtualServiceFieldHTTP = "http"
VirtualServiceFieldHosts = "hosts"
VirtualServiceFieldLabels = "labels"
VirtualServiceFieldName = "name"
VirtualServiceFieldNamespaceId = "namespaceId"
VirtualServiceFieldOwnerReferences = "ownerReferences"
VirtualServiceFieldProjectID = "projectId"
VirtualServiceFieldRemoved = "removed"
VirtualServiceFieldState = "state"
VirtualServiceFieldStatus = "status"
VirtualServiceFieldTCP = "tcp"
VirtualServiceFieldTLS = "tls"
VirtualServiceFieldTransitioning = "transitioning"
VirtualServiceFieldTransitioningMessage = "transitioningMessage"
VirtualServiceFieldUUID = "uuid"
)
type VirtualService struct {
types.Resource
Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"`
Created string `json:"created,omitempty" yaml:"created,omitempty"`
CreatorID string `json:"creatorId,omitempty" yaml:"creatorId,omitempty"`
Gateways []string `json:"gateways,omitempty" yaml:"gateways,omitempty"`
HTTP []HTTPRoute `json:"http,omitempty" yaml:"http,omitempty"`
Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"`
Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
NamespaceId string `json:"namespaceId,omitempty" yaml:"namespaceId,omitempty"`
OwnerReferences []OwnerReference `json:"ownerReferences,omitempty" yaml:"ownerReferences,omitempty"`
ProjectID string `json:"projectId,omitempty" yaml:"projectId,omitempty"`
Removed string `json:"removed,omitempty" yaml:"removed,omitempty"`
State string `json:"state,omitempty" yaml:"state,omitempty"`
Status interface{} `json:"status,omitempty" yaml:"status,omitempty"`
TCP []TCPRoute `json:"tcp,omitempty" yaml:"tcp,omitempty"`
TLS []TLSRoute `json:"tls,omitempty" yaml:"tls,omitempty"`
Transitioning string `json:"transitioning,omitempty" yaml:"transitioning,omitempty"`
TransitioningMessage string `json:"transitioningMessage,omitempty" yaml:"transitioningMessage,omitempty"`
UUID string `json:"uuid,omitempty" yaml:"uuid,omitempty"`
}
type VirtualServiceCollection struct {
types.Collection
Data []VirtualService `json:"data,omitempty"`
client *VirtualServiceClient
}
type VirtualServiceClient struct {
apiClient *Client
}
type VirtualServiceOperations interface {
List(opts *types.ListOpts) (*VirtualServiceCollection, error)
Create(opts *VirtualService) (*VirtualService, error)
Update(existing *VirtualService, updates interface{}) (*VirtualService, error)
Replace(existing *VirtualService) (*VirtualService, error)
ByID(id string) (*VirtualService, error)
Delete(container *VirtualService) error
}
func newVirtualServiceClient(apiClient *Client) *VirtualServiceClient {
return &VirtualServiceClient{
apiClient: apiClient,
}
}
func (c *VirtualServiceClient) Create(container *VirtualService) (*VirtualService, error) {
resp := &VirtualService{}
err := c.apiClient.Ops.DoCreate(VirtualServiceType, container, resp)
return resp, err
}
func (c *VirtualServiceClient) Update(existing *VirtualService, updates interface{}) (*VirtualService, error) {
resp := &VirtualService{}
err := c.apiClient.Ops.DoUpdate(VirtualServiceType, &existing.Resource, updates, resp)
return resp, err
}
func (c *VirtualServiceClient) Replace(obj *VirtualService) (*VirtualService, error) {
resp := &VirtualService{}
err := c.apiClient.Ops.DoReplace(VirtualServiceType, &obj.Resource, obj, resp)
return resp, err
}
func (c *VirtualServiceClient) List(opts *types.ListOpts) (*VirtualServiceCollection, error) {
resp := &VirtualServiceCollection{}
err := c.apiClient.Ops.DoList(VirtualServiceType, opts, resp)
resp.client = c
return resp, err
}
func (cc *VirtualServiceCollection) Next() (*VirtualServiceCollection, error) {
if cc != nil && cc.Pagination != nil && cc.Pagination.Next != "" {
resp := &VirtualServiceCollection{}
err := cc.client.apiClient.Ops.DoNext(cc.Pagination.Next, resp)
resp.client = cc.client
return resp, err
}
return nil, nil
}
func (c *VirtualServiceClient) ByID(id string) (*VirtualService, error) {
resp := &VirtualService{}
err := c.apiClient.Ops.DoByID(VirtualServiceType, id, resp)
return resp, err
}
func (c *VirtualServiceClient) Delete(container *VirtualService) error {
return c.apiClient.Ops.DoResourceDelete(VirtualServiceType, &container.Resource)
}

View File

@ -0,0 +1,18 @@
package client
const (
VirtualServiceSpecType = "virtualServiceSpec"
VirtualServiceSpecFieldGateways = "gateways"
VirtualServiceSpecFieldHTTP = "http"
VirtualServiceSpecFieldHosts = "hosts"
VirtualServiceSpecFieldTCP = "tcp"
VirtualServiceSpecFieldTLS = "tls"
)
type VirtualServiceSpec struct {
Gateways []string `json:"gateways,omitempty" yaml:"gateways,omitempty"`
HTTP []HTTPRoute `json:"http,omitempty" yaml:"http,omitempty"`
Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"`
TCP []TCPRoute `json:"tcp,omitempty" yaml:"tcp,omitempty"`
TLS []TLSRoute `json:"tls,omitempty" yaml:"tls,omitempty"`
}

View File

@ -115,4 +115,6 @@ type Config struct {
PrometheusRules map[string]projectClient.PrometheusRule `json:"prometheusRules,omitempty" yaml:"prometheusRules,omitempty"`
Alertmanagers map[string]projectClient.Alertmanager `json:"alertmanagers,omitempty" yaml:"alertmanagers,omitempty"`
HorizontalPodAutoscalers map[string]projectClient.HorizontalPodAutoscaler `json:"horizontalPodAutoscalers,omitempty" yaml:"horizontalPodAutoscalers,omitempty"`
VirtualServices map[string]projectClient.VirtualService `json:"virtualServices,omitempty" yaml:"virtualServices,omitempty"`
DestinationRules map[string]projectClient.DestinationRule `json:"destinationRules,omitempty" yaml:"destinationRules,omitempty"`
}

View File

@ -20,6 +20,7 @@ import (
managementv3 "github.com/rancher/types/apis/management.cattle.io/v3"
managementSchema "github.com/rancher/types/apis/management.cattle.io/v3/schema"
monitoringv1 "github.com/rancher/types/apis/monitoring.coreos.com/v1"
istiov1alpha3 "github.com/rancher/types/apis/networking.istio.io/v1alpha3"
knetworkingv1 "github.com/rancher/types/apis/networking.k8s.io/v1"
projectv3 "github.com/rancher/types/apis/project.cattle.io/v3"
projectSchema "github.com/rancher/types/apis/project.cattle.io/v3/schema"
@ -189,6 +190,7 @@ type UserContext struct {
Networking knetworkingv1.Interface
Monitoring monitoringv1.Interface
Cluster clusterv3.Interface
Istio istiov1alpha3.Interface
}
func (w *UserContext) controllers() []controller.Starter {
@ -224,6 +226,7 @@ func (w *UserContext) UserOnlyContext() *UserOnlyContext {
BatchV1Beta1: w.BatchV1Beta1,
Monitoring: w.Monitoring,
Cluster: w.Cluster,
Istio: w.Istio,
}
}
@ -244,6 +247,7 @@ type UserOnlyContext struct {
BatchV1Beta1 batchv1beta1.Interface
Monitoring monitoringv1.Interface
Cluster clusterv3.Interface
Istio istiov1alpha3.Interface
}
func (w *UserOnlyContext) controllers() []controller.Starter {
@ -408,6 +412,11 @@ func NewUserContext(scaledContext *ScaledContext, config rest.Config, clusterNam
return nil, err
}
context.Istio, err = istiov1alpha3.NewForConfig(config)
if err != nil {
return nil, err
}
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
@ -497,6 +506,11 @@ func NewUserOnlyContext(config rest.Config) (*UserOnlyContext, error) {
return nil, err
}
context.Istio, err = istiov1alpha3.NewForConfig(config)
if err != nil {
return nil, err
}
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer

View File

@ -5,6 +5,7 @@ package main
import (
monitoringv1 "github.com/coreos/prometheus-operator/pkg/client/monitoring/v1"
istiov1alpha3 "github.com/knative/pkg/apis/istio/v1alpha3"
clusterSchema "github.com/rancher/types/apis/cluster.cattle.io/v3/schema"
managementSchema "github.com/rancher/types/apis/management.cattle.io/v3/schema"
publicSchema "github.com/rancher/types/apis/management.cattle.io/v3public/schema"
@ -96,4 +97,11 @@ func main() {
},
[]interface{}{},
)
generator.GenerateNativeTypes(istiov1alpha3.SchemeGroupVersion,
[]interface{}{
istiov1alpha3.VirtualService{},
istiov1alpha3.DestinationRule{},
},
[]interface{}{},
)
}

View File

@ -4,3 +4,4 @@ github.com/rancher/types
github.com/pkg/errors v0.8.0
github.com/rancher/norman 2da1bd2ffcacdef4bdf7e2c193d32f3b04ebd6d0 transitive=true
github.com/coreos/prometheus-operator v0.25.0
github.com/knative/pkg b30ab9de040eb4ba56fdb4108a29045ecac0c46a https://github.com/rancher/pkg.git

10
vendor/github.com/knative/pkg/.gitattributes generated vendored Normal file
View File

@ -0,0 +1,10 @@
# This file is documented at https://git-scm.com/docs/gitattributes.
# Linguist-specific attributes are documented at
# https://github.com/github/linguist.
**/zz_generated.*.go linguist-generated=true
/client/** linguist-generated=true
/test/** coverage-excluded=true
/metrics/gcp_metadata.go coverage-excluded=true
*.sh text eol=lf

11
vendor/github.com/knative/pkg/.gitignore generated vendored Normal file
View File

@ -0,0 +1,11 @@
# Operating system temporary files
.DS_Store
# Editor/IDE specific settings
.idea
.vscode/
*.iml
# Temporary output of build tools
bazel-*
*.out

5
vendor/github.com/knative/pkg/CONTRIBUTING.md generated vendored Normal file
View File

@ -0,0 +1,5 @@
# Contribution guidelines
So you want to hack on Knative `pkg`? Yay! Please refer to Knative's overall
[contribution guidelines](https://github.com/knative/docs/blob/master/community/CONTRIBUTING.md)
to find out how you can help.

71
vendor/github.com/knative/pkg/DEVELOPMENT.md generated vendored Normal file
View File

@ -0,0 +1,71 @@
# Development
This doc explains how to setup a development environment so you can get started
[contributing](https://github.com/knative/docs/blob/master/community/CONTRIBUTING.md)
to Knative `pkg`. Also take a look at:
- [The pull request workflow](https://github.com/knative/docs/blob/master/community/CONTRIBUTING.md#pull-requests)
## Getting started
1. Create [a GitHub account](https://github.com/join)
1. Setup
[GitHub access via SSH](https://help.github.com/articles/connecting-to-github-with-ssh/)
1. Install [requirements](#requirements)
1. Set up your [shell environment](#environment-setup)
1. [Create and checkout a repo fork](#checkout-your-fork)
Before submitting a PR, see also [CONTRIBUTING.md](./CONTRIBUTING.md).
### Requirements
You must install these tools:
1. [`go`](https://golang.org/doc/install): The language Knative `pkg` is built
in
1. [`git`](https://help.github.com/articles/set-up-git/): For source control
1. [`dep`](https://github.com/golang/dep): For managing external dependencies.
### Environment setup
To get started you'll need to set these environment variables (we recommend
adding them to your `.bashrc`):
1. `GOPATH`: If you don't have one, simply pick a directory and add
`export GOPATH=...`
1. `$GOPATH/bin` on `PATH`: This is so that tooling installed via `go get` will
work properly.
`.bashrc` example:
```shell
export GOPATH="$HOME/go"
export PATH="${PATH}:${GOPATH}/bin"
```
### Checkout your fork
The Go tools require that you clone the repository to the
`src/github.com/knative/pkg` directory in your
[`GOPATH`](https://github.com/golang/go/wiki/SettingGOPATH).
To check out this repository:
1. Create your own
[fork of this repo](https://help.github.com/articles/fork-a-repo/)
1. Clone it to your machine:
```shell
mkdir -p ${GOPATH}/src/github.com/knative
cd ${GOPATH}/src/github.com/knative
git clone git@github.com:${YOUR_GITHUB_USERNAME}/pkg.git
cd pkg
git remote add upstream git@github.com:knative/pkg.git
git remote set-url --push upstream no_push
```
_Adding the `upstream` remote sets you up nicely for regularly
[syncing your fork](https://help.github.com/articles/syncing-a-fork/)._
Once you reach this point you are ready to do a full build and deploy as
described below.

1164
vendor/github.com/knative/pkg/Gopkg.lock generated vendored Normal file

File diff suppressed because it is too large Load Diff

74
vendor/github.com/knative/pkg/Gopkg.toml generated vendored Normal file
View File

@ -0,0 +1,74 @@
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
required = [
"k8s.io/apimachinery/pkg/util/sets/types",
"k8s.io/code-generator/cmd/deepcopy-gen",
"k8s.io/code-generator/cmd/defaulter-gen",
"k8s.io/code-generator/cmd/client-gen",
"k8s.io/code-generator/cmd/lister-gen",
"k8s.io/code-generator/cmd/informer-gen",
"github.com/evanphx/json-patch",
"github.com/knative/test-infra/scripts",
"github.com/knative/test-infra/tools/dep-collector",
"github.com/pkg/errors",
]
[[constraint]]
name = "k8s.io/api"
version = "kubernetes-1.12.6"
[[constraint]]
name = "k8s.io/apimachinery"
version = "kubernetes-1.12.6"
[[constraint]]
name = "k8s.io/client-go"
version = "kubernetes-1.12.6"
[[constraint]]
name = "k8s.io/code-generator"
version = "kubernetes-1.12.6"
[[override]]
name = "github.com/json-iterator/go"
# This is the commit at which k8s depends on this in 1.11
# It seems to be broken at HEAD.
revision = "f2b4162afba35581b6d4a50d3b8f34e33c144682"
[[override]]
name = "go.uber.org/zap"
revision = "67bc79d13d155c02fd008f721863ff8cc5f30659"
[[constraint]]
name = "github.com/google/go-cmp"
# HEAD as of 2019-04-09
revision = "6f77996f0c42f7b84e5a2b252227263f93432e9b"
[[override]]
name = "github.com/rogpeppe/go-internal"
# HEAD as of 2019-01-09
# Needed because release 1.0.0 does not contain a LICENSE file
revision = "4bbc89b6501cca7dd6b5557d78d70c8d2c6e8b97"
[[constraint]]
name = "contrib.go.opencensus.io/exporter/stackdriver"
version = "0.9.2"
[[constraint]]
name = "github.com/knative/test-infra"
branch = "master"
[prune]
go-tests = true
unused-packages = true
non-go = true
[[prune.project]]
name = "k8s.io/code-generator"
unused-packages = false
non-go = false
[[prune.project]]
name = "github.com/knative/test-infra"
non-go = false

201
vendor/github.com/knative/pkg/LICENSE generated vendored Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

6
vendor/github.com/knative/pkg/OWNERS generated vendored Normal file
View File

@ -0,0 +1,6 @@
# The OWNERS file is used by prow to automatically merge approved PRs.
approvers:
- evankanderson
- mattmoor
- vaikas-google

13
vendor/github.com/knative/pkg/README.md generated vendored Normal file
View File

@ -0,0 +1,13 @@
# Knative Common Packages
[![GoDoc](https://godoc.org/github.com/knative/pkg?status.svg)](https://godoc.org/github.com/knative/pkg)
[![Go Report Card](https://goreportcard.com/badge/knative/pkg)](https://goreportcard.com/report/knative/pkg)
Knative `pkg` provides a place for sharing common Knative packages across the
Knative repos.
To learn more about Knative, please visit our
[Knative docs](https://github.com/knative/docs) repository.
If you are interested in contributing, see [CONTRIBUTING.md](./CONTRIBUTING.md)
and [DEVELOPMENT.md](./DEVELOPMENT.md).

6
vendor/github.com/knative/pkg/apis/OWNERS generated vendored Normal file
View File

@ -0,0 +1,6 @@
# The OWNERS file is used by prow to automatically merge approved PRs.
approvers:
- mattmoor
- vaikas-google
- n3wscott

4
vendor/github.com/knative/pkg/apis/istio/OWNERS generated vendored Normal file
View File

@ -0,0 +1,4 @@
# The OWNERS file is used by prow to automatically merge approved PRs.
approvers:
- tcnghia

View File

@ -0,0 +1,35 @@
/*
Copyright 2018 The Knative 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 v1alpha1
// Describes how to match a given string in HTTP headers. Match is
// case-sensitive.
type StringMatch struct {
// Specified exactly one of the fields below.
// exact string match
Exact string `json:"exact,omitempty"`
// prefix-based match
Prefix string `json:"prefix,omitempty"`
// suffix-based match.
Suffix string `json:"suffix,omitempty"`
// ECMAscript style regex-based match
Regex string `json:"regex,omitempty"`
}

21
vendor/github.com/knative/pkg/apis/istio/register.go generated vendored Normal file
View File

@ -0,0 +1,21 @@
/*
Copyright 2018 The Knative 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 istio
const (
GroupName = "networking.istio.io"
)

View File

@ -0,0 +1,17 @@
# What are these files?
These are Go structs for Istio CRD. We translated them from proto files in
https://github.com/istio/api/tree/master/networking/v1alpha3 .
# Why do we hand-translate from proto? i.e Why can't we vendor these?
Istio needs to run on many platforms and as a reason they represent their
objects internally as proto. On Kubernetes, their API take in JSON objects and
convert to proto before processing them.
So they have nothing we can vendor, except for the Go files that are generated
by the proto compiler, which is not compatible with K8s API code-generator at
all.
We may be able to donate our translation so they can maintain it themselves. See
https://github.com/istio/istio/issues/6084.

View File

@ -0,0 +1,547 @@
/*
Copyright 2018 The Knative 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 v1alpha3
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// DestinationRule
type DestinationRule struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec DestinationRuleSpec `json:"spec"`
}
// DestinationRule defines policies that apply to traffic intended for a
// service after routing has occurred. These rules specify configuration
// for load balancing, connection pool size from the sidecar, and outlier
// detection settings to detect and evict unhealthy hosts from the load
// balancing pool. For example, a simple load balancing policy for the
// ratings service would look as follows:
//
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// loadBalancer:
// simple: LEAST_CONN
//
//
// Version specific policies can be specified by defining a named
// subset and overriding the settings specified at the service level. The
// following rule uses a round robin load balancing policy for all traffic
// going to a subset named testversion that is composed of endpoints (e.g.,
// pods) with labels (version:v3).
//
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// loadBalancer:
// simple: LEAST_CONN
// subsets:
// - name: testversion
// labels:
// version: v3
// trafficPolicy:
// loadBalancer:
// simple: ROUND_ROBIN
//
//
// **Note:** Policies specified for subsets will not take effect until
// a route rule explicitly sends traffic to this subset.
//
// Traffic policies can be customized to specific ports as well. The
// following rule uses the least connection load balancing policy for all
// traffic to port 80, while uses a round robin load balancing setting for
// traffic to the port 9080.
//
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings-port
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy: # Apply to all ports
// portLevelSettings:
// - port:
// number: 80
// loadBalancer:
// simple: LEAST_CONN
// - port:
// number: 9080
// loadBalancer:
// simple: ROUND_ROBIN
//
type DestinationRuleSpec struct {
// REQUIRED. The name of a service from the service registry. Service
// names are looked up from the platform's service registry (e.g.,
// Kubernetes services, Consul services, etc.) and from the hosts
// declared by [ServiceEntries](#ServiceEntry). Rules defined for
// services that do not exist in the service registry will be ignored.
//
// *Note for Kubernetes users*: When short names are used (e.g. "reviews"
// instead of "reviews.default.svc.cluster.local"), Istio will interpret
// the short name based on the namespace of the rule, not the service. A
// rule in the "default" namespace containing a host "reviews will be
// interpreted as "reviews.default.svc.cluster.local", irrespective of
// the actual namespace associated with the reviews service. _To avoid
// potential misconfigurations, it is recommended to always use fully
// qualified domain names over short names._
//
// Note that the host field applies to both HTTP and TCP services.
Host string `json:"host"`
// Traffic policies to apply (load balancing policy, connection pool
// sizes, outlier detection).
TrafficPolicy *TrafficPolicy `json:"trafficPolicy,omitempty"`
// One or more named sets that represent individual versions of a
// service. Traffic policies can be overridden at subset level.
Subsets []Subset `json:"subsets,omitempty"`
}
// Traffic policies to apply for a specific destination, across all
// destination ports. See DestinationRule for examples.
type TrafficPolicy struct {
// Settings controlling the load balancer algorithms.
LoadBalancer *LoadBalancerSettings `json:"loadBalancer,omitempty"`
// Settings controlling the volume of connections to an upstream service
ConnectionPool *ConnectionPoolSettings `json:"connectionPool,omitempty"`
// Settings controlling eviction of unhealthy hosts from the load balancing pool
OutlierDetection *OutlierDetection `json:"outlierDetection,omitempty"`
// TLS related settings for connections to the upstream service.
TLS *TLSSettings `json:"tls,omitempty"`
// Traffic policies specific to individual ports. Note that port level
// settings will override the destination-level settings. Traffic
// settings specified at the destination-level will not be inherited when
// overridden by port-level settings, i.e. default values will be applied
// to fields omitted in port-level traffic policies.
PortLevelSettings []PortTrafficPolicy `json:"portLevelSettings,omitempty"`
}
// Traffic policies that apply to specific ports of the service
type PortTrafficPolicy struct {
// Specifies the port name or number of a port on the destination service
// on which this policy is being applied.
//
// Names must comply with DNS label syntax (rfc1035) and therefore cannot
// collide with numbers. If there are multiple ports on a service with
// the same protocol the names should be of the form <protocol-name>-<DNS
// label>.
Port PortSelector `json:"port"`
// Settings controlling the load balancer algorithms.
LoadBalancer *LoadBalancerSettings `json:"loadBalancer,omitempty"`
// Settings controlling the volume of connections to an upstream service
ConnectionPool *ConnectionPoolSettings `json:"connectionPool,omitempty"`
// Settings controlling eviction of unhealthy hosts from the load balancing pool
OutlierDetection *OutlierDetection `json:"outlierDetection,omitempty"`
// TLS related settings for connections to the upstream service.
TLS *TLSSettings `json:"tls,omitempty"`
}
// A subset of endpoints of a service. Subsets can be used for scenarios
// like A/B testing, or routing to a specific version of a service. Refer
// to [VirtualService](#VirtualService) documentation for examples of using
// subsets in these scenarios. In addition, traffic policies defined at the
// service-level can be overridden at a subset-level. The following rule
// uses a round robin load balancing policy for all traffic going to a
// subset named testversion that is composed of endpoints (e.g., pods) with
// labels (version:v3).
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// loadBalancer:
// simple: LEAST_CONN
// subsets:
// - name: testversion
// labels:
// version: v3
// trafficPolicy:
// loadBalancer:
// simple: ROUND_ROBIN
//
// **Note:** Policies specified for subsets will not take effect until
// a route rule explicitly sends traffic to this subset.
type Subset struct {
// REQUIRED. Name of the subset. The service name and the subset name can
// be used for traffic splitting in a route rule.
Name string `json:"name"`
// REQUIRED. Labels apply a filter over the endpoints of a service in the
// service registry. See route rules for examples of usage.
Labels map[string]string `json:"labels"`
// Traffic policies that apply to this subset. Subsets inherit the
// traffic policies specified at the DestinationRule level. Settings
// specified at the subset level will override the corresponding settings
// specified at the DestinationRule level.
TrafficPolicy *TrafficPolicy `json:"trafficPolicy,omitempty"`
}
// Load balancing policies to apply for a specific destination. See Envoy's
// load balancing
// [documentation](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/load_balancing.html)
// for more details.
//
// For example, the following rule uses a round robin load balancing policy
// for all traffic going to the ratings service.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// loadBalancer:
// simple: ROUND_ROBIN
//
// The following example sets up sticky sessions for the ratings service
// hashing-based load balancer for the same ratings service using the
// the User cookie as the hash key.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-ratings
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// loadBalancer:
// consistentHash:
// httpCookie:
// name: user
// ttl: 0s
type LoadBalancerSettings struct {
// It is required to specify exactly one of the fields:
// Simple or ConsistentHash
Simple SimpleLB `json:"simple,omitempty"`
ConsistentHash *ConsistentHashLB `json:"consistentHash,omitempty"`
}
// Standard load balancing algorithms that require no tuning.
type SimpleLB string
const (
// Round Robin policy. Default
SimpleLBRoundRobin SimpleLB = "ROUND_ROBIN"
// The least request load balancer uses an O(1) algorithm which selects
// two random healthy hosts and picks the host which has fewer active
// requests.
SimpleLBLeastConn SimpleLB = "LEAST_CONN"
// The random load balancer selects a random healthy host. The random
// load balancer generally performs better than round robin if no health
// checking policy is configured.
SimpleLBRandom SimpleLB = "RANDOM"
// This option will forward the connection to the original IP address
// requested by the caller without doing any form of load
// balancing. This option must be used with care. It is meant for
// advanced use cases. Refer to Original Destination load balancer in
// Envoy for further details.
SimpleLBPassthrough SimpleLB = "PASSTHROUGH"
)
// Consistent Hash-based load balancing can be used to provide soft
// session affinity based on HTTP headers, cookies or other
// properties. This load balancing policy is applicable only for HTTP
// connections. The affinity to a particular destination host will be
// lost when one or more hosts are added/removed from the destination
// service.
type ConsistentHashLB struct {
// It is required to specify exactly one of the fields as hash key:
// HTTPHeaderName, HTTPCookie, or UseSourceIP.
// Hash based on a specific HTTP header.
HTTPHeaderName string `json:"httpHeaderName,omitempty"`
// Hash based on HTTP cookie.
HTTPCookie *HTTPCookie `json:"httpCookie,omitempty"`
// Hash based on the source IP address.
UseSourceIP bool `json:"useSourceIp,omitempty"`
// The minimum number of virtual nodes to use for the hash
// ring. Defaults to 1024. Larger ring sizes result in more granular
// load distributions. If the number of hosts in the load balancing
// pool is larger than the ring size, each host will be assigned a
// single virtual node.
MinimumRingSize uint64 `json:"minimumRingSize,omitempty"`
}
// Describes a HTTP cookie that will be used as the hash key for the
// Consistent Hash load balancer. If the cookie is not present, it will
// be generated.
type HTTPCookie struct {
// REQUIRED. Name of the cookie.
Name string `json:"name"`
// Path to set for the cookie.
Path string `json:"path,omitempty"`
// REQUIRED. Lifetime of the cookie.
TTL string `json:"ttl"`
}
// Connection pool settings for an upstream host. The settings apply to
// each individual host in the upstream service. See Envoy's [circuit
// breaker](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/circuit_breaking)
// for more details. Connection pool settings can be applied at the TCP
// level as well as at HTTP level.
//
// For example, the following rule sets a limit of 100 connections to redis
// service called myredissrv with a connect timeout of 30ms
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: bookinfo-redis
// spec:
// host: myredissrv.prod.svc.cluster.local
// trafficPolicy:
// connectionPool:
// tcp:
// maxConnections: 100
// connectTimeout: 30ms
type ConnectionPoolSettings struct {
// Settings common to both HTTP and TCP upstream connections.
TCP *TCPSettings `json:"tcp,omitempty"`
// HTTP connection pool settings.
HTTP *HTTPSettings `json:"http,omitempty"`
}
// Settings common to both HTTP and TCP upstream connections.
type TCPSettings struct {
// Maximum number of HTTP1 /TCP connections to a destination host.
MaxConnections int32 `json:"maxConnections,omitempty"`
// TCP connection timeout.
ConnectTimeout string `json:"connectTimeout,omitempty"`
}
// Settings applicable to HTTP1.1/HTTP2/GRPC connections.
type HTTPSettings struct {
// Maximum number of pending HTTP requests to a destination. Default 1024.
HTTP1MaxPendingRequests int32 `json:"http1MaxPendingRequests,omitempty"`
// Maximum number of requests to a backend. Default 1024.
HTTP2MaxRequests int32 `json:"http2MaxRequests,omitempty"`
// Maximum number of requests per connection to a backend. Setting this
// parameter to 1 disables keep alive.
MaxRequestsPerConnection int32 `json:"maxRequestsPerConnection,omitempty"`
// Maximum number of retries that can be outstanding to all hosts in a
// cluster at a given time. Defaults to 3.
MaxRetries int32 `json:"maxRetries,omitempty"`
}
// A Circuit breaker implementation that tracks the status of each
// individual host in the upstream service. Applicable to both HTTP and
// TCP services. For HTTP services, hosts that continually return 5xx
// errors for API calls are ejected from the pool for a pre-defined period
// of time. For TCP services, connection timeouts or connection
// failures to a given host counts as an error when measuring the
// consecutive errors metric. See Envoy's [outlier
// detection](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/outlier)
// for more details.
//
// The following rule sets a connection pool size of 100 connections and
// 1000 concurrent HTTP2 requests, with no more than 10 req/connection to
// "reviews" service. In addition, it configures upstream hosts to be
// scanned every 5 mins, such that any host that fails 7 consecutive times
// with 5XX error code will be ejected for 15 minutes.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: reviews-cb-policy
// spec:
// host: reviews.prod.svc.cluster.local
// trafficPolicy:
// connectionPool:
// tcp:
// maxConnections: 100
// http:
// http2MaxRequests: 1000
// maxRequestsPerConnection: 10
// outlierDetection:
// consecutiveErrors: 7
// interval: 5m
// baseEjectionTime: 15m
type OutlierDetection struct {
// Number of errors before a host is ejected from the connection
// pool. Defaults to 5. When the upstream host is accessed over HTTP, a
// 5xx return code qualifies as an error. When the upstream host is
// accessed over an opaque TCP connection, connect timeouts and
// connection error/failure events qualify as an error.
ConsecutiveErrors int32 `json:"consecutiveErrors,omitempty"`
// Time interval between ejection sweep analysis. format:
// 1h/1m/1s/1ms. MUST BE >=1ms. Default is 10s.
Interval string `json:"interval,omitempty"`
// Minimum ejection duration. A host will remain ejected for a period
// equal to the product of minimum ejection duration and the number of
// times the host has been ejected. This technique allows the system to
// automatically increase the ejection period for unhealthy upstream
// servers. format: 1h/1m/1s/1ms. MUST BE >=1ms. Default is 30s.
BaseEjectionTime string `json:"baseEjectionTime,omitempty"`
// Maximum % of hosts in the load balancing pool for the upstream
// service that can be ejected. Defaults to 10%.
MaxEjectionPercent int32 `json:"maxEjectionPercent,omitempty"`
}
// SSL/TLS related settings for upstream connections. See Envoy's [TLS
// context](https://www.envoyproxy.io/docs/envoy/latest/api-v1/cluster_manager/cluster_ssl.html#config-cluster-manager-cluster-ssl)
// for more details. These settings are common to both HTTP and TCP upstreams.
//
// For example, the following rule configures a client to use mutual TLS
// for connections to upstream database cluster.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: db-mtls
// spec:
// host: mydbserver.prod.svc.cluster.local
// trafficPolicy:
// tls:
// mode: MUTUAL
// clientCertificate: /etc/certs/myclientcert.pem
// privateKey: /etc/certs/client_private_key.pem
// caCertificates: /etc/certs/rootcacerts.pem
//
// The following rule configures a client to use TLS when talking to a
// foreign service whose domain matches *.foo.com.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: tls-foo
// spec:
// host: "*.foo.com"
// trafficPolicy:
// tls:
// mode: SIMPLE
//
// The following rule configures a client to use Istio mutual TLS when talking
// to rating services.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: ratings-istio-mtls
// spec:
// host: ratings.prod.svc.cluster.local
// trafficPolicy:
// tls:
// mode: ISTIO_MUTUAL
type TLSSettings struct {
// REQUIRED: Indicates whether connections to this port should be secured
// using TLS. The value of this field determines how TLS is enforced.
Mode TLSmode `json:"mode"`
// REQUIRED if mode is `MUTUAL`. The path to the file holding the
// client-side TLS certificate to use.
// Should be empty if mode is `ISTIO_MUTUAL`.
ClientCertificate string `json:"clientCertificate,omitempty"`
// REQUIRED if mode is `MUTUAL`. The path to the file holding the
// client's private key.
// Should be empty if mode is `ISTIO_MUTUAL`.
PrivateKey string `json:"privateKey,omitempty"`
// OPTIONAL: The path to the file containing certificate authority
// certificates to use in verifying a presented server certificate. If
// omitted, the proxy will not verify the server's certificate.
// Should be empty if mode is `ISTIO_MUTUAL`.
CaCertificates string `json:"caCertificates,omitempty"`
// A list of alternate names to verify the subject identity in the
// certificate. If specified, the proxy will verify that the server
// certificate's subject alt name matches one of the specified values.
// Should be empty if mode is `ISTIO_MUTUAL`.
SubjectAltNames []string `json:"subjectAltNames,omitempty"`
// SNI string to present to the server during TLS handshake.
// Should be empty if mode is `ISTIO_MUTUAL`.
Sni string `json:"sni,omitempty"`
}
// TLS connection mode
type TLSmode string
const (
// Do not setup a TLS connection to the upstream endpoint.
TLSmodeDisable TLSmode = "DISABLE"
// Originate a TLS connection to the upstream endpoint.
TLSmodeSimple TLSmode = "SIMPLE"
// Secure connections to the upstream using mutual TLS by presenting
// client certificates for authentication.
TLSmodeMutual TLSmode = "MUTUAL"
// Secure connections to the upstream using mutual TLS by presenting
// client certificates for authentication.
// Compared to Mutual mode, this mode uses certificates generated
// automatically by Istio for mTLS authentication. When this mode is
// used, all other fields in `TLSSettings` should be empty.
TLSmodeIstioMutual TLSmode = "ISTIO_MUTUAL"
)
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// DestinationRuleList is a list of DestinationRule resources
type DestinationRuleList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []DestinationRule `json:"items"`
}

View File

@ -0,0 +1,23 @@
/*
Copyright 2018 The Knative 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.
*/
// Api versions allow the api contract for a resource to be changed while keeping
// backward compatibility by support multiple concurrent versions
// of the same resource
// +k8s:deepcopy-gen=package
// +groupName=networking.istio.io
package v1alpha3

View File

@ -0,0 +1,336 @@
/*
Copyright 2018 The Knative 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 v1alpha3
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Gateway describes a load balancer operating at the edge of the mesh
// receiving incoming or outgoing HTTP/TCP connections. The specification
// describes a set of ports that should be exposed, the type of protocol to
// use, SNI configuration for the load balancer, etc.
//
// For example, the following gateway spec sets up a proxy to act as a load
// balancer exposing port 80 and 9080 (http), 443 (https), and port 2379
// (TCP) for ingress. The gateway will be applied to the proxy running on
// a pod with labels "app: my-gateway-controller". While Istio will configure the
// proxy to listen on these ports, it is the responsibility of the user to
// ensure that external traffic to these ports are allowed into the mesh.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
// name: my-gateway
// spec:
// selector:
// app: my-gatweway-controller
// servers:
// - port:
// number: 80
// name: http
// protocol: HTTP
// hosts:
// - uk.bookinfo.com
// - eu.bookinfo.com
// tls:
// httpsRedirect: true # sends 302 redirect for http requests
// - port:
// number: 443
// name: https
// protocol: HTTPS
// hosts:
// - uk.bookinfo.com
// - eu.bookinfo.com
// tls:
// mode: SIMPLE #enables HTTPS on this port
// serverCertificate: /etc/certs/servercert.pem
// privateKey: /etc/certs/privatekey.pem
// - port:
// number: 9080
// name: http-wildcard
// protocol: HTTP
// # no hosts implies wildcard match
// - port:
// number: 2379 #to expose internal service via external port 2379
// name: mongo
// protocol: MONGO
//
// The gateway specification above describes the L4-L6 properties of a load
// balancer. A VirtualService can then be bound to a gateway to control
// the forwarding of traffic arriving at a particular host or gateway port.
//
// For example, the following VirtualService splits traffic for
// https://uk.bookinfo.com/reviews, https://eu.bookinfo.com/reviews,
// http://uk.bookinfo.com:9080/reviews, http://eu.bookinfo.com:9080/reviews
// into two versions (prod and qa) of an internal reviews service on port
// 9080. In addition, requests containing the cookie user: dev-123 will be
// sent to special port 7777 in the qa version. The same rule is also
// applicable inside the mesh for requests to the reviews.prod
// service. This rule is applicable across ports 443, 9080. Note that
// http://uk.bookinfo.com gets redirected to https://uk.bookinfo.com
// (i.e. 80 redirects to 443).
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: bookinfo-rule
// spec:
// hosts:
// - reviews.prod
// - uk.bookinfo.com
// - eu.bookinfo.com
// gateways:
// - my-gateway
// - mesh # applies to all the sidecars in the mesh
// http:
// - match:
// - headers:
// cookie:
// user: dev-123
// route:
// - destination:
// port:
// number: 7777
// name: reviews.qa
// - match:
// uri:
// prefix: /reviews/
// route:
// - destination:
// port:
// number: 9080 # can be omitted if its the only port for reviews
// name: reviews.prod
// weight: 80
// - destination:
// name: reviews.qa
// weight: 20
//
// The following VirtualService forwards traffic arriving at (external) port
// 2379 from 172.17.16.0/24 subnet to internal Mongo server on port 5555. This
// rule is not applicable internally in the mesh as the gateway list omits
// the reserved name "mesh".
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: bookinfo-Mongo
// spec:
// hosts:
// - mongosvr #name of Mongo service
// gateways:
// - my-gateway
// tcp:
// - match:
// - port:
// number: 2379
// sourceSubnet: "172.17.16.0/24"
// route:
// - destination:
// name: mongo.prod
//
type Gateway struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec GatewaySpec `json:"spec"`
}
type GatewaySpec struct {
// REQUIRED: A list of server specifications.
Servers []Server `json:"servers"`
// One or more labels that indicate a specific set of pods/VMs
// on which this gateway configuration should be applied.
// If no selectors are provided, the gateway will be implemented by
// the default istio-ingress controller.
Selector map[string]string `json:"selector,omitempty"`
}
// Server describes the properties of the proxy on a given load balancer port.
// For example,
//
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
// name: my-ingress
// spec:
// selector:
// app: my-ingress-controller
// servers:
// - port:
// number: 80
// name: http2
// protocol: HTTP2
//
// Another example
//
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
// name: my-tcp-ingress
// spec:
// selector:
// app: my-tcp-ingress-controller
// servers:
// - port:
// number: 27018
// name: mongo
// protocol: MONGO
//
// The following is an example of TLS configuration for port 443
//
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
// name: my-tls-ingress
// spec:
// selector:
// app: my-tls-ingress-controller
// servers:
// - port:
// number: 443
// name: https
// protocol: HTTPS
// tls:
// mode: SIMPLE
// serverCertificate: /etc/certs/server.pem
// privateKey: /etc/certs/privatekey.pem
//
type Server struct {
// REQUIRED: The Port on which the proxy should listen for incoming
// connections
Port Port `json:"port"`
// A list of hosts exposed by this gateway. While
// typically applicable to HTTP services, it can also be used for TCP
// services using TLS with SNI. Standard DNS wildcard prefix syntax
// is permitted.
//
// A VirtualService that is bound to a gateway must having a matching host
// in its default destination. Specifically one of the VirtualService
// destination hosts is a strict suffix of a gateway host or
// a gateway host is a suffix of one of the VirtualService hosts.
Hosts []string `json:"hosts,omitempty"`
// Set of TLS related options that govern the server's behavior. Use
// these options to control if all http requests should be redirected to
// https, and the TLS modes to use.
TLS *TLSOptions `json:"tls,omitempty"`
}
type TLSOptions struct {
// If set to true, the load balancer will send a 302 redirect for all
// http connections, asking the clients to use HTTPS.
HTTPSRedirect bool `json:"httpsRedirect"`
// Optional: Indicates whether connections to this port should be
// secured using TLS. The value of this field determines how TLS is
// enforced.
Mode TLSMode `json:"mode,omitempty"`
// REQUIRED if mode is "SIMPLE" or "MUTUAL". The path to the file
// holding the server-side TLS certificate to use.
ServerCertificate string `json:"serverCertificate"`
// REQUIRED if mode is "SIMPLE" or "MUTUAL". The path to the file
// holding the server's private key.
PrivateKey string `json:"privateKey"`
// REQUIRED if mode is "MUTUAL". The path to a file containing
// certificate authority certificates to use in verifying a presented
// client side certificate.
CaCertificates string `json:"caCertificates"`
// The credentialName stands for a unique identifier that can be used
// to identify the serverCertificate and the privateKey. The
// credentialName appended with suffix "-cacert" is used to identify
// the CaCertificates associated with this server. Gateway workloads
// capable of fetching credentials from a remote credential store such
// as Kubernetes secrets, will be configured to retrieve the
// serverCertificate and the privateKey using credentialName, instead
// of using the file system paths specified above. If using mutual TLS,
// gateway workload instances will retrieve the CaCertificates using
// credentialName-cacert. The semantics of the name are platform
// dependent. In Kubernetes, the default Istio supplied credential
// server expects the credentialName to match the name of the
// Kubernetes secret that holds the server certificate, the private
// key, and the CA certificate (if using mutual TLS). Set the
// `ISTIO_META_USER_SDS` metadata variable in the gateway's proxy to
// enable the dynamic credential fetching feature.
CredentialName string `json:"credentialName,omitempty"`
// A list of alternate names to verify the subject identity in the
// certificate presented by the client.
SubjectAltNames []string `json:"subjectAltNames"`
}
// TLS modes enforced by the proxy
type TLSMode string
const (
// If set to "PASSTHROUGH", the proxy will forward the connection
// to the upstream server selected based on the SNI string presented
// by the client.
TLSModePassThrough TLSMode = "PASSTHROUGH"
// If set to "SIMPLE", the proxy will secure connections with
// standard TLS semantics.
TLSModeSimple TLSMode = "SIMPLE"
// If set to "MUTUAL", the proxy will secure connections to the
// upstream using mutual TLS by presenting client certificates for
// authentication.
TLSModeMutual TLSMode = "MUTUAL"
)
// Port describes the properties of a specific port of a service.
type Port struct {
// REQUIRED: A valid non-negative integer port number.
Number int `json:"number"`
// REQUIRED: The protocol exposed on the port.
// MUST BE one of HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP.
Protocol PortProtocol `json:"protocol"`
// Label assigned to the port.
Name string `json:"name,omitempty"`
}
type PortProtocol string
const (
ProtocolHTTP PortProtocol = "HTTP"
ProtocolHTTPS PortProtocol = "HTTPS"
ProtocolGRPC PortProtocol = "GRPC"
ProtocolHTTP2 PortProtocol = "HTTP2"
ProtocolMongo PortProtocol = "Mongo"
ProtocolTCP PortProtocol = "TCP"
)
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// GatewayList is a list of Gateway resources
type GatewayList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []Gateway `json:"items"`
}

View File

@ -0,0 +1,58 @@
/*
Copyright 2018 The Knative 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 v1alpha3
import (
"github.com/knative/pkg/apis/istio"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: istio.GroupName, Version: "v1alpha3"}
// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
return SchemeGroupVersion.WithKind(kind).GroupKind()
}
// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
return SchemeGroupVersion.WithResource(resource).GroupResource()
}
var (
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
AddToScheme = SchemeBuilder.AddToScheme
)
// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&VirtualService{},
&Gateway{},
&DestinationRule{},
&VirtualServiceList{},
&GatewayList{},
&DestinationRuleList{},
&ServiceEntry{},
&ServiceEntryList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}

View File

@ -0,0 +1,39 @@
package v1alpha3
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type ServiceEntry struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ServiceEntrySpec `json:"spec"`
}
type ServiceEntrySpec struct {
Hosts []string `json:"hosts,omitempty"`
Addresses []string `json:"addresses,omitempty"`
Ports []Port `json:"ports,omitempty"`
Location int32 `json:"location,omitempty"`
Resolution int32 `json:"resolution,omitempty"`
Endpoints []ServiceEntry_Endpoint `json:"endpoints,omitempty"`
}
type ServiceEntry_Endpoint struct {
Address string `json:"address,omitempty"`
Ports map[string]uint32 `json:"ports,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type ServiceEntryList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []ServiceEntry `json:"items"`
}

View File

@ -0,0 +1,882 @@
/*
Copyright 2018 The Knative 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 v1alpha3
import (
"github.com/knative/pkg/apis/istio/common/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// VirtualService
type VirtualService struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec VirtualServiceSpec `json:"spec"`
}
// A VirtualService defines a set of traffic routing rules to apply when a host is
// addressed. Each routing rule defines matching criteria for traffic of a specific
// protocol. If the traffic is matched, then it is sent to a named destination service
// (or subset/version of it) defined in the registry.
//
// The source of traffic can also be matched in a routing rule. This allows routing
// to be customized for specific client contexts.
//
// The following example routes all HTTP traffic by default to
// pods of the reviews service with label "version: v1". In addition,
// HTTP requests containing /wpcatalog/, /consumercatalog/ url prefixes will
// be rewritten to /newcatalog and sent to pods with label "version: v2". The
// rules will be applied at the gateway named "bookinfo" as well as at all
// the sidecars in the mesh (indicated by the reserved gateway name
// "mesh").
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: reviews-route
// spec:
// hosts:
// - reviews
// gateways: # if omitted, defaults to "mesh"
// - bookinfo
// - mesh
// http:
// - match:
// - uri:
// prefix: "/wpcatalog"
// - uri:
// prefix: "/consumercatalog"
// rewrite:
// uri: "/newcatalog"
// route:
// - destination:
// host: reviews
// subset: v2
// - route:
// - destination:
// host: reviews
// subset: v1
//
// A subset/version of a route destination is identified with a reference
// to a named service subset which must be declared in a corresponding
// DestinationRule.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: reviews-destination
// spec:
// host: reviews
// subsets:
// - name: v1
// labels:
// version: v1
// - name: v2
// labels:
// version: v2
//
// A host name can be defined by only one VirtualService. A single
// VirtualService can be used to describe traffic properties for multiple
// HTTP and TCP ports.
type VirtualServiceSpec struct {
// REQUIRED. The destination address for traffic captured by this virtual
// service. Could be a DNS name with wildcard prefix or a CIDR
// prefix. Depending on the platform, short-names can also be used
// instead of a FQDN (i.e. has no dots in the name). In such a scenario,
// the FQDN of the host would be derived based on the underlying
// platform.
//
// For example on Kubernetes, when hosts contains a short name, Istio will
// interpret the short name based on the namespace of the rule. Thus, when a
// client namespace applies a rule in the "default" namespace containing a name
// "reviews, Istio will setup routes to the "reviews.default.svc.cluster.local"
// service. However, if a different name such as "reviews.sales.svc.cluster.local"
// is used, it would be treated as a FQDN during virtual host matching.
// In Consul, a plain service name would be resolved to the FQDN
// "reviews.service.consul".
//
// Note that the hosts field applies to both HTTP and TCP
// services. Service inside the mesh, i.e., those found in the service
// registry, must always be referred to using their alphanumeric
// names. IP addresses or CIDR prefixes are allowed only for services
// defined via the Gateway.
Hosts []string `json:"hosts"`
// The names of gateways and sidecars that should apply these routes. A
// single VirtualService is used for sidecars inside the mesh as well
// as for one or more gateways. The selection condition imposed by this field
// can be overridden using the source field in the match conditions of HTTP/TCP
// routes. The reserved word "mesh" is used to imply all the sidecars in
// the mesh. When this field is omitted, the default gateway ("mesh")
// will be used, which would apply the rule to all sidecars in the
// mesh. If a list of gateway names is provided, the rules will apply
// only to the gateways. To apply the rules to both gateways and sidecars,
// specify "mesh" as one of the gateway names.
Gateways []string `json:"gateways,omitempty"`
// An ordered list of route rules for HTTP traffic.
// The first rule matching an incoming request is used.
HTTP []HTTPRoute `json:"http,omitempty"`
// An ordered list of route rules for TCP traffic.
// The first rule matching an incoming request is used.
TCP []TCPRoute `json:"tcp,omitempty"`
TLS []TLSRoute `json:"tls,omitempty"`
}
// Describes match conditions and actions for routing HTTP/1.1, HTTP2, and
// gRPC traffic. See VirtualService for usage examples.
type HTTPRoute struct {
// Match conditions to be satisfied for the rule to be
// activated. All conditions inside a single match block have AND
// semantics, while the list of match blocks have OR semantics. The rule
// is matched if any one of the match blocks succeed.
Match []HTTPMatchRequest `json:"match,omitempty"`
// A http rule can either redirect or forward (default) traffic. The
// forwarding target can be one of several versions of a service (see
// glossary in beginning of document). Weights associated with the
// service version determine the proportion of traffic it receives.
Route []HTTPRouteDestination `json:"route,omitempty"`
// A http rule can either redirect or forward (default) traffic. If
// traffic passthrough option is specified in the rule,
// route/redirect will be ignored. The redirect primitive can be used to
// send a HTTP 302 redirect to a different URI or Authority.
Redirect *HTTPRedirect `json:"redirect,omitempty"`
// Rewrite HTTP URIs and Authority headers. Rewrite cannot be used with
// Redirect primitive. Rewrite will be performed before forwarding.
Rewrite *HTTPRewrite `json:"rewrite,omitempty"`
// Indicates that a HTTP/1.1 client connection to this particular route
// should be allowed (and expected) to upgrade to a WebSocket connection.
// The default is false. Istio's reference sidecar implementation (Envoy)
// expects the first request to this route to contain the WebSocket
// upgrade headers. Otherwise, the request will be rejected. Note that
// Websocket allows secondary protocol negotiation which may then be
// subject to further routing rules based on the protocol selected.
WebsocketUpgrade bool `json:"websocketUpgrade,omitempty"`
// Timeout for HTTP requests.
Timeout string `json:"timeout,omitempty"`
// Retry policy for HTTP requests.
Retries *HTTPRetry `json:"retries,omitempty"`
// Fault injection policy to apply on HTTP traffic.
Fault *HTTPFaultInjection `json:"fault,omitempty"`
// Mirror HTTP traffic to a another destination in addition to forwarding
// the requests to the intended destination. Mirrored traffic is on a
// best effort basis where the sidecar/gateway will not wait for the
// mirrored cluster to respond before returning the response from the
// original destination. Statistics will be generated for the mirrored
// destination.
Mirror *Destination `json:"mirror,omitempty"`
// Additional HTTP headers to add before forwarding a request to the
// destination service.
DeprecatedAppendHeaders map[string]string `json:"appendHeaders,omitempty"`
// Header manipulation rules
Headers *Headers `json:"headers,omitempty"`
// Http headers to remove before returning the response to the caller
RemoveResponseHeaders map[string]string `json:"removeResponseHeaders,omitempty"`
// Cross-Origin Resource Sharing policy
CorsPolicy *CorsPolicy `json:"corsPolicy,omitempty"`
}
// Headers describes header manipulation rules.
type Headers struct {
// Header manipulation rules to apply before forwarding a request
// to the destination service
Request *HeaderOperations `json:"request,omitempty"`
// Header manipulation rules to apply before returning a response
// to the caller
Response *HeaderOperations `json:"response,omitempty"`
}
// HeaderOperations Describes the header manipulations to apply
type HeaderOperations struct {
// Overwrite the headers specified by key with the given values
Set map[string]string `json:"set,omitempty"`
// Append the given values to the headers specified by keys
// (will create a comma-separated list of values)
Add map[string]string `json:"add,omitempty"`
// Remove a the specified headers
Remove []string `json:"remove,omitempty"`
}
// HttpMatchRequest specifies a set of criterion to be met in order for the
// rule to be applied to the HTTP request. For example, the following
// restricts the rule to match only requests where the URL path
// starts with /ratings/v2/ and the request contains a "cookie" with value
// "user=jason".
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - match:
// - headers:
// cookie:
// regex: "^(.*?;)?(user=jason)(;.*)?"
// uri:
// prefix: "/ratings/v2/"
// route:
// - destination:
// host: ratings
//
// HTTPMatchRequest CANNOT be empty.
type HTTPMatchRequest struct {
// URI to match
// values are case-sensitive and formatted as follows:
//
// - `exact: "value"` for exact string match
//
// - `prefix: "value"` for prefix-based match
//
// - `regex: "value"` for ECMAscript style regex-based match
//
URI *v1alpha1.StringMatch `json:"uri,omitempty"`
// URI Scheme
// values are case-sensitive and formatted as follows:
//
// - `exact: "value"` for exact string match
//
// - `prefix: "value"` for prefix-based match
//
// - `regex: "value"` for ECMAscript style regex-based match
//
Scheme *v1alpha1.StringMatch `json:"scheme,omitempty"`
// HTTP Method
// values are case-sensitive and formatted as follows:
//
// - `exact: "value"` for exact string match
//
// - `prefix: "value"` for prefix-based match
//
// - `regex: "value"` for ECMAscript style regex-based match
//
Method *v1alpha1.StringMatch `json:"method,omitempty"`
// HTTP Authority
// values are case-sensitive and formatted as follows:
//
// - `exact: "value"` for exact string match
//
// - `prefix: "value"` for prefix-based match
//
// - `regex: "value"` for ECMAscript style regex-based match
//
Authority *v1alpha1.StringMatch `json:"authority,omitempty"`
// The header keys must be lowercase and use hyphen as the separator,
// e.g. _x-request-id_.
//
// Header values are case-sensitive and formatted as follows:
//
// - `exact: "value"` for exact string match
//
// - `prefix: "value"` for prefix-based match
//
// - `regex: "value"` for ECMAscript style regex-based match
//
// **Note:** The keys `uri`, `scheme`, `method`, and `authority` will be ignored.
Headers map[string]v1alpha1.StringMatch `json:"headers,omitempty"`
// Specifies the ports on the host that is being addressed. Many services
// only expose a single port or label ports with the protocols they support,
// in these cases it is not required to explicitly select the port.
Port uint32 `json:"port,omitempty"`
// One or more labels that constrain the applicability of a rule to
// workloads with the given labels. If the VirtualService has a list of
// gateways specified at the top, it should include the reserved gateway
// `mesh` in order for this field to be applicable.
SourceLabels map[string]string `json:"sourceLabels,omitempty"`
// Names of gateways where the rule should be applied to. Gateway names
// at the top of the VirtualService (if any) are overridden. The gateway match is
// independent of sourceLabels.
Gateways []string `json:"gateways,omitempty"`
}
type HTTPRouteDestination struct {
// REQUIRED. Destination uniquely identifies the instances of a service
// to which the request/connection should be forwarded to.
Destination Destination `json:"destination"`
// REQUIRED. The proportion of traffic to be forwarded to the service
// version. (0-100). Sum of weights across destinations SHOULD BE == 100.
// If there is only destination in a rule, the weight value is assumed to
// be 100.
Weight int `json:"weight"`
// Header manipulation rules
Headers *Headers `json:"headers,omitempty"`
}
// Destination indicates the network addressable service to which the
// request/connection will be sent after processing a routing rule. The
// destination.name should unambiguously refer to a service in the service
// registry. It can be a short name or a fully qualified domain name from
// the service registry, a resolvable DNS name, an IP address or a service
// name from the service registry and a subset name. The order of inference
// is as follows:
//
// 1. Service registry lookup. The entire name is looked up in the service
// registry. If the lookup succeeds, the search terminates. The requests
// will be routed to any instance of the service in the mesh. When the
// service name consists of a single word, the FQDN will be constructed in
// a platform specific manner. For example, in Kubernetes, the namespace
// associated with the routing rule will be used to identify the service as
// <servicename>.<rulenamespace>. However, if the service name contains
// multiple words separated by a dot (e.g., reviews.prod), the name in its
// entirety would be looked up in the service registry.
//
// 2. Runtime DNS lookup by the proxy. If step 1 fails, and the name is not
// an IP address, it will be considered as a DNS name that is not in the
// service registry (e.g., wikipedia.org). The sidecar/gateway will resolve
// the DNS and load balance requests appropriately. See Envoy's strict_dns
// for details.
//
// The following example routes all traffic by default to pods of the
// reviews service with label "version: v1" (i.e., subset v1), and some
// to subset v2, in a kubernetes environment.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: reviews-route
// spec:
// hosts:
// - reviews # namespace is same as the client/caller's namespace
// http:
// - match:
// - uri:
// prefix: "/wpcatalog"
// - uri:
// prefix: "/consumercatalog"
// rewrite:
// uri: "/newcatalog"
// route:
// - destination:
// host: reviews
// subset: v2
// - route:
// - destination:
// host: reviews
// subset: v1
//
// And the associated DestinationRule
//
// apiVersion: networking.istio.io/v1alpha3
// kind: DestinationRule
// metadata:
// name: reviews-destination
// spec:
// host: reviews
// subsets:
// - name: v1
// labels:
// version: v1
// - name: v2
// labels:
// version: v2
//
// The following VirtualService sets a timeout of 5s for all calls to
// productpage.prod service. Notice that there are no subsets defined in
// this rule. Istio will fetch all instances of productpage.prod service
// from the service registry and populate the sidecar's load balancing
// pool.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: my-productpage-rule
// spec:
// hosts:
// - productpage.prod # in kubernetes, this applies only to prod namespace
// http:
// - timeout: 5s
// route:
// - destination:
// host: productpage.prod
//
// The following sets a timeout of 5s for all calls to the external
// service wikipedia.org, as there is no internal service of that name.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: my-wiki-rule
// spec:
// hosts:
// - wikipedia.org
// http:
// - timeout: 5s
// route:
// - destination:
// host: wikipedia.org
//
type Destination struct {
// REQUIRED. The name of a service from the service registry. Service
// names are looked up from the platform's service registry (e.g.,
// Kubernetes services, Consul services, etc.) and from the hosts
// declared by [ServiceEntry](#ServiceEntry). Traffic forwarded to
// destinations that are not found in either of the two, will be dropped.
//
// *Note for Kubernetes users*: When short names are used (e.g. "reviews"
// instead of "reviews.default.svc.cluster.local"), Istio will interpret
// the short name based on the namespace of the rule, not the service. A
// rule in the "default" namespace containing a host "reviews will be
// interpreted as "reviews.default.svc.cluster.local", irrespective of
// the actual namespace associated with the reviews service. _To avoid
// potential misconfigurations, it is recommended to always use fully
// qualified domain names over short names._
Host string `json:"host"`
// The name of a subset within the service. Applicable only to services
// within the mesh. The subset must be defined in a corresponding
// DestinationRule.
Subset string `json:"subset,omitempty"`
// Specifies the port on the host that is being addressed. If a service
// exposes only a single port it is not required to explicitly select the
// port.
Port PortSelector `json:"port,omitempty"`
}
// PortSelector specifies the number of a port to be used for
// matching or selection for final routing.
type PortSelector struct {
// Choose one of the fields below.
// Valid port number
Number uint32 `json:"number,omitempty"`
// Valid port name
Name string `json:"name,omitempty"`
}
// Describes match conditions and actions for routing TCP traffic. The
// following routing rule forwards traffic arriving at port 27017 for
// mongo.prod.svc.cluster.local from 172.17.16.* subnet to another Mongo
// server on port 5555.
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: bookinfo-Mongo
// spec:
// hosts:
// - mongo.prod.svc.cluster.local
// tcp:
// - match:
// - port: 27017
// sourceSubnet: "172.17.16.0/24"
// route:
// - destination:
// host: mongo.backup.svc.cluster.local
// port:
// number: 5555
// ```
type TCPRoute struct {
// Match conditions to be satisfied for the rule to be
// activated. All conditions inside a single match block have AND
// semantics, while the list of match blocks have OR semantics. The rule
// is matched if any one of the match blocks succeed.
Match []L4MatchAttributes `json:"match"`
// The destinations to which the connection should be forwarded to. Weights
// must add to 100%.
Route []HTTPRouteDestination `json:"route"`
}
// Describes match conditions and actions for routing unterminated TLS
// traffic (TLS/HTTPS) The following routing rule forwards unterminated TLS
// traffic arriving at port 443 of gateway called mygateway to internal
// services in the mesh based on the SNI value.
//
// ```yaml
// kind: VirtualService
// metadata:
// name: bookinfo-sni
// spec:
// hosts:
// - '*.bookinfo.com'
// gateways:
// - mygateway
// tls:
// - match:
// - port: 443
// sniHosts:
// - login.bookinfo.com
// route:
// - destination:
// host: login.prod.svc.cluster.local
// - match:
// - port: 443
// sniHosts:
// - reviews.bookinfo.com
// route:
// - destination:
// host: reviews.prod.svc.cluster.local
// ```
type TLSRoute struct {
// REQUIRED. Match conditions to be satisfied for the rule to be
// activated. All conditions inside a single match block have AND
// semantics, while the list of match blocks have OR semantics. The rule
// is matched if any one of the match blocks succeed.
Match []TLSMatchAttributes `json:"match"`
// The destination to which the connection should be forwarded to.
Route []HTTPRouteDestination `json:"route"`
}
// L4 connection match attributes. Note that L4 connection matching support
// is incomplete.
type L4MatchAttributes struct {
// IPv4 or IPv6 ip address of destination with optional subnet. E.g.,
// a.b.c.d/xx form or just a.b.c.d.
DestinationSubnets []string `json:"destinationSubnets,omitempty"`
// Specifies the port on the host that is being addressed. Many services
// only expose a single port or label ports with the protocols they support,
// in these cases it is not required to explicitly select the port.
Port int `json:"port,omitempty"`
// One or more labels that constrain the applicability of a rule to
// workloads with the given labels. If the VirtualService has a list of
// gateways specified at the top, it should include the reserved gateway
// `mesh` in order for this field to be applicable.
SourceLabels map[string]string `json:"sourceLabels,omitempty"`
// Names of gateways where the rule should be applied to. Gateway names
// at the top of the VirtualService (if any) are overridden. The gateway match is
// independent of sourceLabels.
Gateways []string `json:"gateways,omitempty"`
}
// TLS connection match attributes.
type TLSMatchAttributes struct {
// REQUIRED. SNI (server name indicator) to match on. Wildcard prefixes
// can be used in the SNI value, e.g., *.com will match foo.example.com
// as well as example.com. An SNI value must be a subset (i.e., fall
// within the domain) of the corresponding virtual service's hosts
SniHosts []string `json:"sniHosts"`
// IPv4 or IPv6 ip addresses of destination with optional subnet. E.g.,
// a.b.c.d/xx form or just a.b.c.d.
DestinationSubnets []string `json:"destinationSubnets,omitempty"`
// Specifies the port on the host that is being addressed. Many services
// only expose a single port or label ports with the protocols they support,
// in these cases it is not required to explicitly select the port.
Port int `json:"port,omitempty"`
// One or more labels that constrain the applicability of a rule to
// workloads with the given labels. If the VirtualService has a list of
// gateways specified at the top, it should include the reserved gateway
// `mesh` in order for this field to be applicable.
SourceLabels map[string]string `json:"sourceLabels,omitempty"`
// Names of gateways where the rule should be applied to. Gateway names
// at the top of the VirtualService (if any) are overridden. The gateway match is
// independent of sourceLabels.
Gateways []string `json:"gateways,omitempty"`
}
// HTTPRedirect can be used to send a 302 redirect response to the caller,
// where the Authority/Host and the URI in the response can be swapped with
// the specified values. For example, the following rule redirects
// requests for /v1/getProductRatings API on the ratings service to
// /v1/bookRatings provided by the bookratings service.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - match:
// - uri:
// exact: /v1/getProductRatings
// redirect:
// uri: /v1/bookRatings
// authority: bookratings.default.svc.cluster.local
// ...
//
type HTTPRedirect struct {
// On a redirect, overwrite the Path portion of the URL with this
// value. Note that the entire path will be replaced, irrespective of the
// request URI being matched as an exact path or prefix.
URI string `json:"uri,omitempty"`
// On a redirect, overwrite the Authority/Host portion of the URL with
// this value.
Authority string `json:"authority,omitempty"`
}
// HTTPRewrite can be used to rewrite specific parts of a HTTP request
// before forwarding the request to the destination. Rewrite primitive can
// be used only with the HTTPRouteDestinations. The following example
// demonstrates how to rewrite the URL prefix for api call (/ratings) to
// ratings service before making the actual API call.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - match:
// - uri:
// prefix: /ratings
// rewrite:
// uri: /v1/bookRatings
// route:
// - destination:
// host: ratings
// subset: v1
//
type HTTPRewrite struct {
// rewrite the path (or the prefix) portion of the URI with this
// value. If the original URI was matched based on prefix, the value
// provided in this field will replace the corresponding matched prefix.
URI string `json:"uri,omitempty"`
// rewrite the Authority/Host header with this value.
Authority string `json:"authority,omitempty"`
}
// Describes the retry policy to use when a HTTP request fails. For
// example, the following rule sets the maximum number of retries to 3 when
// calling ratings:v1 service, with a 2s timeout per retry attempt.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - route:
// - destination:
// host: ratings
// subset: v1
// retries:
// attempts: 3
// perTryTimeout: 2s
//
type HTTPRetry struct {
// REQUIRED. Number of retries for a given request. The interval
// between retries will be determined automatically (25ms+). Actual
// number of retries attempted depends on the httpReqTimeout.
Attempts int `json:"attempts"`
// Timeout per retry attempt for a given request. format: 1h/1m/1s/1ms. MUST BE >=1ms.
PerTryTimeout string `json:"perTryTimeout"`
}
// Describes the Cross-Origin Resource Sharing (CORS) policy, for a given
// service. Refer to
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
// for further details about cross origin resource sharing. For example,
// the following rule restricts cross origin requests to those originating
// from example.com domain using HTTP POST/GET, and sets the
// Access-Control-Allow-Credentials header to false. In addition, it only
// exposes X-Foo-bar header and sets an expiry period of 1 day.
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - route:
// - destination:
// host: ratings
// subset: v1
// corsPolicy:
// allowOrigin:
// - example.com
// allowMethods:
// - POST
// - GET
// allowCredentials: false
// allowHeaders:
// - X-Foo-Bar
// maxAge: "1d"
//
type CorsPolicy struct {
// The list of origins that are allowed to perform CORS requests. The
// content will be serialized into the Access-Control-Allow-Origin
// header. Wildcard * will allow all origins.
AllowOrigin []string `json:"allowOrigin,omitempty"`
// List of HTTP methods allowed to access the resource. The content will
// be serialized into the Access-Control-Allow-Methods header.
AllowMethods []string `json:"allowMethods,omitempty"`
// List of HTTP headers that can be used when requesting the
// resource. Serialized to Access-Control-Allow-Methods header.
AllowHeaders []string `json:"allowHeaders,omitempty"`
// A white list of HTTP headers that the browsers are allowed to
// access. Serialized into Access-Control-Expose-Headers header.
ExposeHeaders []string `json:"exposeHeaders,omitempty"`
// Specifies how long the results of a preflight request can be
// cached. Translates to the Access-Control-Max-Age header.
MaxAge string `json:"maxAge,omitempty"`
// Indicates whether the caller is allowed to send the actual request
// (not the preflight) using credentials. Translates to
// Access-Control-Allow-Credentials header.
AllowCredentials bool `json:"allowCredentials,omitempty"`
}
// HTTPFaultInjection can be used to specify one or more faults to inject
// while forwarding http requests to the destination specified in a route.
// Fault specification is part of a VirtualService rule. Faults include
// aborting the Http request from downstream service, and/or delaying
// proxying of requests. A fault rule MUST HAVE delay or abort or both.
//
// *Note:* Delay and abort faults are independent of one another, even if
// both are specified simultaneously.
type HTTPFaultInjection struct {
// Delay requests before forwarding, emulating various failures such as
// network issues, overloaded upstream service, etc.
Delay *InjectDelay `json:"delay,omitempty"`
// Abort Http request attempts and return error codes back to downstream
// service, giving the impression that the upstream service is faulty.
Abort *InjectAbort `json:"abort,omitempty"`
}
// Delay specification is used to inject latency into the request
// forwarding path. The following example will introduce a 5 second delay
// in 10% of the requests to the "v1" version of the "reviews"
// service from all pods with label env: prod
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: reviews-route
// spec:
// hosts:
// - reviews
// http:
// - match:
// - sourceLabels:
// env: prod
// route:
// - destination:
// host: reviews
// subset: v1
// fault:
// delay:
// percent: 10
// fixedDelay: 5s
//
// The _fixedDelay_ field is used to indicate the amount of delay in
// seconds. An optional _percent_ field, a value between 0 and 100, can
// be used to only delay a certain percentage of requests. If left
// unspecified, all request will be delayed.
type InjectDelay struct {
// Percentage of requests on which the delay will be injected (0-100).
Percent int `json:"percent,omitempty"`
// REQUIRED. Add a fixed delay before forwarding the request. Format:
// 1h/1m/1s/1ms. MUST be >=1ms.
FixedDelay string `json:"fixedDelay"`
// (-- Add a delay (based on an exponential function) before forwarding
// the request. mean delay needed to derive the exponential delay
// values --)
ExponentialDelay string `json:"exponentialDelay,omitempty"`
}
// Abort specification is used to prematurely abort a request with a
// pre-specified error code. The following example will return an HTTP
// 400 error code for 10% of the requests to the "ratings" service "v1".
//
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
// name: ratings-route
// spec:
// hosts:
// - ratings
// http:
// - route:
// - destination:
// host: ratings
// subset: v1
// fault:
// abort:
// percent: 10
// httpStatus: 400
//
// The _httpStatus_ field is used to indicate the HTTP status code to
// return to the caller. The optional _percent_ field, a value between 0
// and 100, is used to only abort a certain percentage of requests. If
// not specified, all requests are aborted.
type InjectAbort struct {
// Percentage of requests to be aborted with the error code provided (0-100).
Percent int `json:"percent,omitempty"`
// REQUIRED. HTTP status code to use to abort the Http request.
HTTPStatus int `json:"httpStatus"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// VirtualServiceList is a list of VirtualService resources
type VirtualServiceList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []VirtualService `json:"items"`
}

File diff suppressed because it is too large Load Diff

75
vendor/github.com/knative/pkg/code-of-conduct.md generated vendored Normal file
View File

@ -0,0 +1,75 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of
experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening,
offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at
knative-code-of-conduct@googlegroups.com. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and
appropriate to the circumstances. The project team is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of
specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4, available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org