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:
commit
da74a07be3
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
72
apis/networking.istio.io/v1alpha3/zz_generated_deepcopy.go
Normal file
72
apis/networking.istio.io/v1alpha3/zz_generated_deepcopy.go
Normal 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
|
||||
}
|
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
139
apis/networking.istio.io/v1alpha3/zz_generated_k8s_client.go
Normal file
139
apis/networking.istio.io/v1alpha3/zz_generated_k8s_client.go
Normal 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,
|
||||
}
|
||||
}
|
42
apis/networking.istio.io/v1alpha3/zz_generated_scheme.go
Normal file
42
apis/networking.istio.io/v1alpha3/zz_generated_scheme.go
Normal 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
|
||||
}
|
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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{}
|
||||
}{})
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
12
client/project/v3/zz_generated_connection_pool_settings.go
Normal file
12
client/project/v3/zz_generated_connection_pool_settings.go
Normal 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"`
|
||||
}
|
16
client/project/v3/zz_generated_consistent_hash_lb.go
Normal file
16
client/project/v3/zz_generated_consistent_hash_lb.go
Normal 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"`
|
||||
}
|
20
client/project/v3/zz_generated_cors_policy.go
Normal file
20
client/project/v3/zz_generated_cors_policy.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_destination.go
Normal file
14
client/project/v3/zz_generated_destination.go
Normal 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"`
|
||||
}
|
117
client/project/v3/zz_generated_destination_rule.go
Normal file
117
client/project/v3/zz_generated_destination_rule.go
Normal 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)
|
||||
}
|
14
client/project/v3/zz_generated_destination_rule_spec.go
Normal file
14
client/project/v3/zz_generated_destination_rule_spec.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_header_operations.go
Normal file
14
client/project/v3/zz_generated_header_operations.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_headers.go
Normal file
12
client/project/v3/zz_generated_headers.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_http_cookie.go
Normal file
14
client/project/v3/zz_generated_http_cookie.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_http_fault_injection.go
Normal file
12
client/project/v3/zz_generated_http_fault_injection.go
Normal 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"`
|
||||
}
|
24
client/project/v3/zz_generated_http_match_request.go
Normal file
24
client/project/v3/zz_generated_http_match_request.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_http_redirect.go
Normal file
12
client/project/v3/zz_generated_http_redirect.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_http_retry.go
Normal file
12
client/project/v3/zz_generated_http_retry.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_http_rewrite.go
Normal file
12
client/project/v3/zz_generated_http_rewrite.go
Normal 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"`
|
||||
}
|
34
client/project/v3/zz_generated_http_route.go
Normal file
34
client/project/v3/zz_generated_http_route.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_http_route_destination.go
Normal file
14
client/project/v3/zz_generated_http_route_destination.go
Normal 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"`
|
||||
}
|
16
client/project/v3/zz_generated_http_settings.go
Normal file
16
client/project/v3/zz_generated_http_settings.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_inject_abort.go
Normal file
12
client/project/v3/zz_generated_inject_abort.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_inject_delay.go
Normal file
14
client/project/v3/zz_generated_inject_delay.go
Normal 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"`
|
||||
}
|
16
client/project/v3/zz_generated_l4match_attributes.go
Normal file
16
client/project/v3/zz_generated_l4match_attributes.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_load_balancer_settings.go
Normal file
12
client/project/v3/zz_generated_load_balancer_settings.go
Normal 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"`
|
||||
}
|
16
client/project/v3/zz_generated_outlier_detection.go
Normal file
16
client/project/v3/zz_generated_outlier_detection.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_port_selector.go
Normal file
12
client/project/v3/zz_generated_port_selector.go
Normal 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"`
|
||||
}
|
18
client/project/v3/zz_generated_port_traffic_policy.go
Normal file
18
client/project/v3/zz_generated_port_traffic_policy.go
Normal 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"`
|
||||
}
|
16
client/project/v3/zz_generated_string_match.go
Normal file
16
client/project/v3/zz_generated_string_match.go
Normal 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"`
|
||||
}
|
14
client/project/v3/zz_generated_subset.go
Normal file
14
client/project/v3/zz_generated_subset.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_tcp_route.go
Normal file
12
client/project/v3/zz_generated_tcp_route.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_tcp_settings.go
Normal file
12
client/project/v3/zz_generated_tcp_settings.go
Normal 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"`
|
||||
}
|
18
client/project/v3/zz_generated_tls_match_attributes.go
Normal file
18
client/project/v3/zz_generated_tls_match_attributes.go
Normal 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"`
|
||||
}
|
12
client/project/v3/zz_generated_tls_route.go
Normal file
12
client/project/v3/zz_generated_tls_route.go
Normal 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"`
|
||||
}
|
20
client/project/v3/zz_generated_tls_settings.go
Normal file
20
client/project/v3/zz_generated_tls_settings.go
Normal 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"`
|
||||
}
|
18
client/project/v3/zz_generated_traffic_policy.go
Normal file
18
client/project/v3/zz_generated_traffic_policy.go
Normal 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"`
|
||||
}
|
121
client/project/v3/zz_generated_virtual_service.go
Normal file
121
client/project/v3/zz_generated_virtual_service.go
Normal 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)
|
||||
}
|
18
client/project/v3/zz_generated_virtual_service_spec.go
Normal file
18
client/project/v3/zz_generated_virtual_service_spec.go
Normal 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"`
|
||||
}
|
@ -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"`
|
||||
}
|
||||
|
@ -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
|
||||
|
8
main.go
8
main.go
@ -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{}{},
|
||||
)
|
||||
}
|
||||
|
@ -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
10
vendor/github.com/knative/pkg/.gitattributes
generated
vendored
Normal 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
11
vendor/github.com/knative/pkg/.gitignore
generated
vendored
Normal 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
5
vendor/github.com/knative/pkg/CONTRIBUTING.md
generated
vendored
Normal 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
71
vendor/github.com/knative/pkg/DEVELOPMENT.md
generated
vendored
Normal 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
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
74
vendor/github.com/knative/pkg/Gopkg.toml
generated
vendored
Normal 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
201
vendor/github.com/knative/pkg/LICENSE
generated
vendored
Normal 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
6
vendor/github.com/knative/pkg/OWNERS
generated
vendored
Normal 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
13
vendor/github.com/knative/pkg/README.md
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
# Knative Common Packages
|
||||
|
||||
[](https://godoc.org/github.com/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
6
vendor/github.com/knative/pkg/apis/OWNERS
generated
vendored
Normal 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
4
vendor/github.com/knative/pkg/apis/istio/OWNERS
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# The OWNERS file is used by prow to automatically merge approved PRs.
|
||||
|
||||
approvers:
|
||||
- tcnghia
|
35
vendor/github.com/knative/pkg/apis/istio/common/v1alpha1/string.go
generated
vendored
Normal file
35
vendor/github.com/knative/pkg/apis/istio/common/v1alpha1/string.go
generated
vendored
Normal 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
21
vendor/github.com/knative/pkg/apis/istio/register.go
generated
vendored
Normal 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"
|
||||
)
|
17
vendor/github.com/knative/pkg/apis/istio/v1alpha3/README.md
generated
vendored
Normal file
17
vendor/github.com/knative/pkg/apis/istio/v1alpha3/README.md
generated
vendored
Normal 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.
|
547
vendor/github.com/knative/pkg/apis/istio/v1alpha3/destinationrule_types.go
generated
vendored
Normal file
547
vendor/github.com/knative/pkg/apis/istio/v1alpha3/destinationrule_types.go
generated
vendored
Normal 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"`
|
||||
}
|
23
vendor/github.com/knative/pkg/apis/istio/v1alpha3/doc.go
generated
vendored
Normal file
23
vendor/github.com/knative/pkg/apis/istio/v1alpha3/doc.go
generated
vendored
Normal 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
|
336
vendor/github.com/knative/pkg/apis/istio/v1alpha3/gateway_types.go
generated
vendored
Normal file
336
vendor/github.com/knative/pkg/apis/istio/v1alpha3/gateway_types.go
generated
vendored
Normal 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"`
|
||||
}
|
58
vendor/github.com/knative/pkg/apis/istio/v1alpha3/register.go
generated
vendored
Normal file
58
vendor/github.com/knative/pkg/apis/istio/v1alpha3/register.go
generated
vendored
Normal 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
|
||||
}
|
39
vendor/github.com/knative/pkg/apis/istio/v1alpha3/service_entry.go
generated
vendored
Normal file
39
vendor/github.com/knative/pkg/apis/istio/v1alpha3/service_entry.go
generated
vendored
Normal 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"`
|
||||
}
|
882
vendor/github.com/knative/pkg/apis/istio/v1alpha3/virtualservice_types.go
generated
vendored
Normal file
882
vendor/github.com/knative/pkg/apis/istio/v1alpha3/virtualservice_types.go
generated
vendored
Normal 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"`
|
||||
}
|
1287
vendor/github.com/knative/pkg/apis/istio/v1alpha3/zz_generated.deepcopy.go
generated
vendored
Normal file
1287
vendor/github.com/knative/pkg/apis/istio/v1alpha3/zz_generated.deepcopy.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
75
vendor/github.com/knative/pkg/code-of-conduct.md
generated
vendored
Normal file
75
vendor/github.com/knative/pkg/code-of-conduct.md
generated
vendored
Normal 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
|
Loading…
Reference in New Issue
Block a user