// EndpointsAttributes returns the attributes of an endpoint such that a // generic.SelectionPredicate can match appropriately. func EndpointsAttributes(obj runtime.Object) (objLabels labels.Set, objFields fields.Set, err error) { endpoints, ok := obj.(*api.Endpoints) if !ok { return nil, nil, fmt.Errorf("invalid object type %#v", obj) } return endpoints.Labels, generic.ObjectMetaFieldsSet(endpoints.ObjectMeta, true), nil }
// JobSelectableFields returns a field set that represents the object for matching purposes. func JobToSelectableFields(job *extensions.Job) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(job.ObjectMeta, true) specificFieldsSet := fields.Set{ "status.successful": strconv.Itoa(job.Status.Succeeded), } return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet) }
// ControllerToSelectableFields returns a field set that represents the object. func ControllerToSelectableFields(controller *api.ReplicationController) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(controller.ObjectMeta, true) controllerSpecificFieldsSet := fields.Set{ "status.replicas": strconv.Itoa(int(controller.Status.Replicas)), } return generic.MergeFieldsSets(objectMetaFieldsSet, controllerSpecificFieldsSet) }
// NodeToSelectableFields returns a field set that represents the object. func NodeToSelectableFields(node *api.Node) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(&node.ObjectMeta, false) specificFieldsSet := fields.Set{ "spec.unschedulable": fmt.Sprint(node.Spec.Unschedulable), } return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet) }
func getAttrs(obj runtime.Object) (objLabels labels.Set, objFields fields.Set, err error) { event, ok := obj.(*api.Event) if !ok { return nil, nil, errors.NewInternalError(fmt.Errorf("object is not of type event: %#v", obj)) } l := event.Labels if l == nil { l = labels.Set{} } objectMetaFieldsSet := generic.ObjectMetaFieldsSet(event.ObjectMeta, true) specificFieldsSet := fields.Set{ "involvedObject.kind": event.InvolvedObject.Kind, "involvedObject.namespace": event.InvolvedObject.Namespace, "involvedObject.name": event.InvolvedObject.Name, "involvedObject.uid": string(event.InvolvedObject.UID), "involvedObject.apiVersion": event.InvolvedObject.APIVersion, "involvedObject.resourceVersion": event.InvolvedObject.ResourceVersion, "involvedObject.fieldPath": event.InvolvedObject.FieldPath, "reason": event.Reason, "source": event.Source.Component, "type": event.Type, } return l, generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet), nil }
// SelectableFields returns a label set that can be used for filter selection func SelectableFields(obj *api.Secret) labels.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(obj.ObjectMeta, true) secretSpecificFieldsSet := fields.Set{ "type": string(obj.Type), } return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, secretSpecificFieldsSet)) }
// ReplicaSetToSelectableFields returns a field set that represents the object. func ReplicaSetToSelectableFields(rs *extensions.ReplicaSet) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(&rs.ObjectMeta, true) rsSpecificFieldsSet := fields.Set{ "status.replicas": strconv.Itoa(int(rs.Status.Replicas)), } return generic.MergeFieldsSets(objectMetaFieldsSet, rsSpecificFieldsSet) }
// PersistentVolumeClaimToSelectableFields returns a field set that represents the object func PersistentVolumeClaimToSelectableFields(persistentvolumeclaim *api.PersistentVolumeClaim) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(persistentvolumeclaim.ObjectMeta, true) specificFieldsSet := fields.Set{ // This is a bug, but we need to support it for backward compatibility. "name": persistentvolumeclaim.Name, } return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet) }
// PersistentVolumeToSelectableFields returns a label set that represents the object func PersistentVolumeToSelectableFields(persistentvolume *api.PersistentVolume) labels.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(persistentvolume.ObjectMeta, false) specificFieldsSet := fields.Set{ // This is a bug, but we need to support it for backward compatibility. "name": persistentvolume.Name, } return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet)) }
// PodToSelectableFields returns a field set that represents the object // TODO: fields are not labels, and the validation rules for them do not apply. func PodToSelectableFields(pod *api.Pod) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(pod.ObjectMeta, true) podSpecificFieldsSet := fields.Set{ "spec.nodeName": pod.Spec.NodeName, "status.phase": string(pod.Status.Phase), } return generic.MergeFieldsSets(objectMetaFieldsSet, podSpecificFieldsSet) }
// NamespaceToSelectableFields returns a field set that represents the object func NamespaceToSelectableFields(namespace *api.Namespace) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(&namespace.ObjectMeta, false) specificFieldsSet := fields.Set{ "status.phase": string(namespace.Status.Phase), // This is a bug, but we need to support it for backward compatibility. "name": namespace.Name, } return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet) }
func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (*etcdtesting.EtcdTestServer, *Store) { podPrefix := "/pods" server, sc := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true} sc.Codec = testapi.Default.StorageCodec() s, err := factory.Create(*sc) if err != nil { t.Fatalf("Error creating storage: %v", err) } if hasCacheEnabled { config := storage.CacherConfig{ CacheCapacity: 10, Storage: s, Versioner: etcdstorage.APIObjectVersioner{}, Type: &api.Pod{}, ResourcePrefix: podPrefix, KeyFunc: func(obj runtime.Object) (string, error) { return storage.NoNamespaceKeyFunc(podPrefix, obj) }, NewListFunc: func() runtime.Object { return &api.PodList{} }, Codec: sc.Codec, } s = storage.NewCacherFromConfig(config) } return server, &Store{ NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: func() runtime.Object { return &api.PodList{} }, QualifiedResource: api.Resource("pods"), CreateStrategy: strategy, UpdateStrategy: strategy, DeleteStrategy: strategy, KeyRootFunc: func(ctx api.Context) string { return podPrefix }, KeyFunc: func(ctx api.Context, id string) (string, error) { if _, ok := api.NamespaceFrom(ctx); !ok { return "", fmt.Errorf("namespace is required") } return path.Join(podPrefix, id), nil }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Pod).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { return &generic.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { pod, ok := obj.(*api.Pod) if !ok { return nil, nil, fmt.Errorf("not a pod") } return labels.Set(pod.ObjectMeta.Labels), generic.ObjectMetaFieldsSet(pod.ObjectMeta, true), nil }, } }, Storage: s, } }
// EventToSelectableFields returns a field set that represents the object func EventToSelectableFields(event *api.Event) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(&event.ObjectMeta, true) specificFieldsSet := fields.Set{ "involvedObject.kind": event.InvolvedObject.Kind, "involvedObject.namespace": event.InvolvedObject.Namespace, "involvedObject.name": event.InvolvedObject.Name, "involvedObject.uid": string(event.InvolvedObject.UID), "involvedObject.apiVersion": event.InvolvedObject.APIVersion, "involvedObject.resourceVersion": event.InvolvedObject.ResourceVersion, "involvedObject.fieldPath": event.InvolvedObject.FieldPath, "reason": event.Reason, "source": event.Source.Component, "type": event.Type, } return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet) }
func NewTestGenericStoreRegistry(t *testing.T) (*etcdtesting.EtcdTestServer, *Store) { podPrefix := "/pods" server := etcdtesting.NewEtcdTestClientServer(t) s := etcdstorage.NewEtcdStorage(server.Client, testapi.Default.StorageCodec(), etcdtest.PathPrefix(), false, etcdtest.DeserializationCacheSize) strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true} return server, &Store{ NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: func() runtime.Object { return &api.PodList{} }, QualifiedResource: api.Resource("pods"), CreateStrategy: strategy, UpdateStrategy: strategy, DeleteStrategy: strategy, KeyRootFunc: func(ctx api.Context) string { return podPrefix }, KeyFunc: func(ctx api.Context, id string) (string, error) { if _, ok := api.NamespaceFrom(ctx); !ok { return "", fmt.Errorf("namespace is required") } return path.Join(podPrefix, id), nil }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Pod).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return &generic.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { pod, ok := obj.(*api.Pod) if !ok { return nil, nil, fmt.Errorf("not a pod") } return labels.Set(pod.ObjectMeta.Labels), generic.ObjectMetaFieldsSet(pod.ObjectMeta, true), nil }, } }, Storage: s, } }
// StorageClassToSelectableFields returns a label set that represents the object func StorageClassToSelectableFields(storageClass *storage.StorageClass) fields.Set { return generic.ObjectMetaFieldsSet(&storageClass.ObjectMeta, false) }
// ResourceQuotaToSelectableFields returns a field set that represents the object func ResourceQuotaToSelectableFields(resourcequota *api.ResourceQuota) fields.Set { return generic.ObjectMetaFieldsSet(&resourcequota.ObjectMeta, true) }
func ServiceToSelectableFields(service *api.Service) fields.Set { return generic.ObjectMetaFieldsSet(service.ObjectMeta, true) }
// CronJobToSelectableFields returns a field set that represents the object for matching purposes. func CronJobToSelectableFields(scheduledJob *batch.CronJob) fields.Set { return generic.ObjectMetaFieldsSet(&scheduledJob.ObjectMeta, true) }
// DeploymentToSelectableFields returns a field set that represents the object. func DeploymentToSelectableFields(deployment *extensions.Deployment) fields.Set { return generic.ObjectMetaFieldsSet(deployment.ObjectMeta) }
func ClusterToSelectableFields(cluster *federation.Cluster) fields.Set { return generic.ObjectMetaFieldsSet(&cluster.ObjectMeta, false) }
// SelectableFields returns a label set that represents the object func SelectableFields(obj *api.ServiceAccount) labels.Set { return labels.Set(generic.ObjectMetaFieldsSet(obj.ObjectMeta, true)) }
// PodSecurityPolicyToSelectableFields returns a label set that represents the object func PodSecurityPolicyToSelectableFields(obj *extensions.PodSecurityPolicy) fields.Set { return generic.ObjectMetaFieldsSet(obj.ObjectMeta, false) }
// DaemonSetToSelectableFields returns a field set that represents the object. func DaemonSetToSelectableFields(daemon *extensions.DaemonSet) fields.Set { return generic.ObjectMetaFieldsSet(daemon.ObjectMeta, true) }
// ResourceQuotaToSelectableFields returns a label set that represents the object func ResourceQuotaToSelectableFields(resourcequota *api.ResourceQuota) labels.Set { return labels.Set(generic.ObjectMetaFieldsSet(resourcequota.ObjectMeta, true)) }
// IngressToSelectableFields returns a field set that represents the object. func IngressToSelectableFields(ingress *extensions.Ingress) fields.Set { return generic.ObjectMetaFieldsSet(&ingress.ObjectMeta, true) }
// APIServiceToSelectableFields returns a field set that represents the object. func APIServiceToSelectableFields(obj *apiregistration.APIService) fields.Set { return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true) }
// SelectableFields returns a field set that can be used for filter selection func SelectableFields(obj *api.SecurityContextConstraints) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true) return objectMetaFieldsSet }
// NetworkPolicyToSelectableFields returns a field set that represents the object. func NetworkPolicyToSelectableFields(networkPolicy *extensions.NetworkPolicy) fields.Set { return generic.ObjectMetaFieldsSet(&networkPolicy.ObjectMeta, true) }
// EndpointsToSelectableFields returns a field set that represents the object // TODO: fields are not labels, and the validation rules for them do not apply. func EndpointsToSelectableFields(endpoints *api.Endpoints) fields.Set { return generic.ObjectMetaFieldsSet(&endpoints.ObjectMeta, true) }
// ConfigMapToSelectableFields returns a field set that represents the object for matching purposes. func ConfigMapToSelectableFields(cfg *api.ConfigMap) fields.Set { return generic.ObjectMetaFieldsSet(cfg.ObjectMeta, true) }