// deleteAllContentForGroupVersionResource will use the dynamic client to delete each resource identified in gvr. // It returns an estimate of the time remaining before the remaining resources are deleted. // If estimate > 0, not all resources are guaranteed to be gone. func deleteAllContentForGroupVersionResource( kubeClient clientset.Interface, clientPool dynamic.ClientPool, opCache operationNotSupportedCache, gvr unversioned.GroupVersionResource, namespace string, namespaceDeletedAt unversioned.Time, ) (int64, error) { glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - namespace: %s, gvr: %v", namespace, gvr) // estimate how long it will take for the resource to be deleted (needed for objects that support graceful delete) estimate, err := estimateGracefulTermination(kubeClient, gvr, namespace, namespaceDeletedAt) if err != nil { glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - unable to estimate - namespace: %s, gvr: %v, err: %v", namespace, gvr, err) return estimate, err } glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - estimate - namespace: %s, gvr: %v, estimate: %v", namespace, gvr, estimate) // get a client for this group version... dynamicClient, err := clientPool.ClientForGroupVersion(gvr.GroupVersion()) if err != nil { glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - unable to get client - namespace: %s, gvr: %v, err: %v", namespace, gvr, err) return estimate, err } // first try to delete the entire collection deleteCollectionSupported, err := deleteCollection(dynamicClient, opCache, gvr, namespace) if err != nil { return estimate, err } // delete collection was not supported, so we list and delete each item... if !deleteCollectionSupported { err = deleteEachItem(dynamicClient, opCache, gvr, namespace) if err != nil { return estimate, err } } // verify there are no more remaining items // it is not an error condition for there to be remaining items if local estimate is non-zero glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - checking for no more items in namespace: %s, gvr: %v", namespace, gvr) unstructuredList, listSupported, err := listCollection(dynamicClient, opCache, gvr, namespace) if err != nil { glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - error verifying no items in namespace: %s, gvr: %v, err: %v", namespace, gvr, err) return estimate, err } if !listSupported { return estimate, nil } glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - items remaining - namespace: %s, gvr: %v, items: %v", namespace, gvr, len(unstructuredList.Items)) if len(unstructuredList.Items) != 0 && estimate == int64(0) { return estimate, fmt.Errorf("unexpected items still remain in namespace: %s for gvr: %v", namespace, gvr) } return estimate, nil }
func (o *ResourceConfig) ResourceEnabled(resource unversioned.GroupVersionResource) bool { versionOverride, versionExists := o.GroupVersionResourceConfigs[resource.GroupVersion()] if !versionExists { return false } if !versionOverride.Enable { return false } if versionOverride.DisabledResources.Has(resource.Resource) { return false } if len(versionOverride.EnabledResources) > 0 { return versionOverride.EnabledResources.Has(resource.Resource) } return true }
// test the list and watch functions correctly converts the ListOptions func TestGCListWatcher(t *testing.T) { testHandler := &fakeActionHandler{} srv, clientConfig := testServerAndClientConfig(testHandler.ServeHTTP) defer srv.Close() clientPool := dynamic.NewClientPool(clientConfig, dynamic.LegacyAPIPathResolverFunc) podResource := unversioned.GroupVersionResource{Version: "v1", Resource: "pods"} client, err := clientPool.ClientForGroupVersion(podResource.GroupVersion()) if err != nil { t.Fatal(err) } lw := gcListWatcher(client, podResource) lw.Watch(api.ListOptions{ResourceVersion: "1"}) lw.List(api.ListOptions{ResourceVersion: "1"}) if e, a := 2, len(testHandler.actions); e != a { t.Errorf("expect %d requests, got %d", e, a) } if e, a := "resourceVersion=1", testHandler.actions[0].query; e != a { t.Errorf("expect %s, got %s", e, a) } if e, a := "resourceVersion=1", testHandler.actions[1].query; e != a { t.Errorf("expect %s, got %s", e, a) } }
// TODO turn this into reusable method checking available resources func contains(resourcesList map[string]*unversioned.APIResourceList, resource unversioned.GroupVersionResource) bool { if resourcesList == nil { return false } resourcesGroup, ok := resourcesList[resource.GroupVersion().String()] if !ok { return false } for _, item := range resourcesGroup.APIResources { if resource.Resource == item.Name { return true } } return false }