Skip to content

Commit

Permalink
Yurtctl revert adds the function of deleting yurt app manager (openyu…
Browse files Browse the repository at this point in the history
…rtio#555)

yurtctl revert add func to delete yurtappmanager
  • Loading branch information
yanyhui authored Nov 5, 2021
1 parent 1258546 commit 824816b
Show file tree
Hide file tree
Showing 2 changed files with 178 additions and 8 deletions.
140 changes: 132 additions & 8 deletions pkg/yurtctl/cmd/revert/revert.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/spf13/pflag"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/klog"

Expand All @@ -38,10 +39,11 @@ import (

// RevertOptions has the information required by the revert operation
type RevertOptions struct {
clientSet *kubernetes.Clientset
YurtctlServantImage string
PodMainfestPath string
KubeadmConfPath string
clientSet *kubernetes.Clientset
YurtctlServantImage string
PodMainfestPath string
KubeadmConfPath string
yurtAppManagerClientSet dynamic.Interface
}

// NewRevertOptions creates a new RevertOptions
Expand Down Expand Up @@ -98,6 +100,11 @@ func (ro *RevertOptions) Complete(flags *pflag.FlagSet) error {
if err != nil {
return err
}

ro.yurtAppManagerClientSet, err = kubeutil.GenDynamicClientSet(flags)
if err != nil {
return err
}
return nil
}

Expand Down Expand Up @@ -206,7 +213,14 @@ func (ro *RevertOptions) RunRevert() (err error) {
return
}

// 5. enable node-controller
// 5. remove the yurt app manager
if err = removeYurtAppManager(ro.clientSet, ro.yurtAppManagerClientSet); err != nil {
klog.Errorf("fail to remove the yurt app manager: %s", err)
return
}
klog.Info("yurt app manager is removed")

// 6. enable node-controller
if err = kubeutil.RunServantJobs(ro.clientSet,
map[string]string{
"action": "enable",
Expand All @@ -219,7 +233,7 @@ func (ro *RevertOptions) RunRevert() (err error) {
}
klog.Info("complete enabling node-controller")

// 6. remove yurt-hub and revert kubelet service on edge nodes
// 7. remove yurt-hub and revert kubelet service on edge nodes
ctx := map[string]string{
"action": "revert",
"yurtctl_servant_image": ro.YurtctlServantImage,
Expand All @@ -232,15 +246,15 @@ func (ro *RevertOptions) RunRevert() (err error) {
}
klog.Info("complete removing yurt-hub and resetting kubelet service on edge nodes")

// 7. remove yurt-hub and revert kubelet service on cloud nodes
// 8. remove yurt-hub and revert kubelet service on cloud nodes
ctx["sub_command"] = "cloudnode"
if err = kubeutil.RunServantJobs(ro.clientSet, ctx, cloudNodeNames); err != nil {
klog.Errorf("fail to revert edge node: %s", err)
return
}
klog.Info("complete removing yurt-hub and resetting kubelet service on cloud nodes")

// 8. remove yut-hub k8s config, roleBinding role
// 9. remove yut-hub k8s config, roleBinding role
err = kubeutil.DeleteYurthubSetting(ro.clientSet)
if err != nil {
klog.Error("DeleteYurthubSetting err: ", err)
Expand Down Expand Up @@ -327,6 +341,116 @@ func removeYurtTunnelServer(client *kubernetes.Clientset) error {
return nil
}

func removeYurtAppManager(client *kubernetes.Clientset, yurtAppManagerClientSet dynamic.Interface) error {
// 1. remove the Deployment
if err := client.AppsV1().
Deployments("kube-system").
Delete(context.Background(), constants.YurtAppManager,
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the deployment/%s: %s",
constants.YurtAppManager, err)
}
klog.Info("deployment for yurt app manager is removed")
klog.V(4).Infof("deployment/%s is deleted", constants.YurtAppManager)

// 2. remove the Role
if err := client.RbacV1().Roles("kube-system").
Delete(context.Background(), "yurt-app-leader-election-role",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the role/%s: %s",
"yurt-app-leader-election-role", err)
}
klog.Info("Role for yurt app manager is removed")

// 3. remove the ClusterRole
if err := client.RbacV1().ClusterRoles().
Delete(context.Background(), "yurt-app-manager-role",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the clusterrole/%s: %s",
"yurt-app-manager-role", err)
}
klog.Info("ClusterRole for yurt app manager is removed")

// 4. remove the ClusterRoleBinding
if err := client.RbacV1().ClusterRoleBindings().
Delete(context.Background(), "yurt-app-manager-rolebinding",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the clusterrolebinding/%s: %s",
"yurt-app-manager-rolebinding", err)
}
klog.Info("ClusterRoleBinding for yurt app manager is removed")
klog.V(4).Infof("clusterrolebinding/%s is deleted", "yurt-app-manager-rolebinding")

// 5. remove the RoleBinding
if err := client.RbacV1().RoleBindings("kube-system").
Delete(context.Background(), "yurt-app-leader-election-rolebinding",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the rolebinding/%s: %s",
"yurt-app-leader-election-rolebinding", err)
}
klog.Info("RoleBinding for yurt app manager is removed")
klog.V(4).Infof("clusterrolebinding/%s is deleted", "yurt-app-leader-election-rolebinding")

// 6 remove the Secret
if err := client.CoreV1().Secrets("kube-system").
Delete(context.Background(), "yurt-app-webhook-certs",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the secret/%s: %s",
"yurt-app-webhook-certs", err)
}
klog.Info("secret for yurt app manager is removed")
klog.V(4).Infof("secret/%s is deleted", "yurt-app-webhook-certs")

// 7 remove Service
if err := client.CoreV1().Services("kube-system").
Delete(context.Background(), "yurt-app-webhook-service",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the service/%s: %s",
"yurt-app-webhook-service", err)
}
klog.Info("Service for yurt app manager is removed")
klog.V(4).Infof("service/%s is deleted", "yurt-app-webhook-service")

// 8. remove the MutatingWebhookConfiguration
if err := client.AdmissionregistrationV1beta1().MutatingWebhookConfigurations().
Delete(context.Background(), "yurt-app-mutating-webhook-configuration",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the MutatingWebhookConfiguration/%s: %s",
"yurt-app-mutating-webhook-configuration", err)
}
klog.Info("MutatingWebhookConfiguration for yurt app manager is removed")
klog.V(4).Infof("MutatingWebhookConfiguration/%s is deleted", "yurt-app-mutating-webhook-configuration")

// 9. remove the ValidatingWebhookConfiguration
if err := client.AdmissionregistrationV1beta1().ValidatingWebhookConfigurations().
Delete(context.Background(), "yurt-app-validating-webhook-configuration",
metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("fail to delete the ValidatingWebhookConfiguration/%s: %s",
"yurt-app-validating-webhook-configuration", err)
}
klog.Info("ValidatingWebhookConfiguration for yurt app manager is removed")
klog.V(4).Infof("ValidatingWebhookConfiguration/%s is deleted", "yurt-app-validating-webhook-configuration")

// 10. remove nodepoolcrd
if err := kubeutil.DeleteCRDResource(client, yurtAppManagerClientSet,
"NodePool", "nodepools.apps.openyurt.io", []byte(constants.YurtAppManagerNodePool)); err != nil {
return fmt.Errorf("fail to delete the NodePoolCRD/%s: %s",
"nodepoolcrd", err)
}
klog.Info("crd for yurt app manager is removed")
klog.V(4).Infof("NodePoolCRD/%s is deleted", "NodePool")

// 11. remove UnitedDeploymentcrd
if err := kubeutil.DeleteCRDResource(client, yurtAppManagerClientSet,
"UnitedDeployment", "uniteddeployments.apps.openyurt.io", []byte(constants.YurtAppManagerUnitedDeployment)); err != nil {
return fmt.Errorf("fail to delete the UnitedDeploymentCRD/%s: %s",
"UnitedDeployment", err)
}
klog.Info("UnitedDeploymentcrd for yurt app manager is removed")
klog.V(4).Infof("UnitedDeploymentCRD/%s is deleted", "UnitedDeployment")
return nil
}

func removeYurtTunnelAgent(client *kubernetes.Clientset) error {
// 1. remove the DaemonSet
if err := client.AppsV1().
Expand Down
46 changes: 46 additions & 0 deletions pkg/yurtctl/util/kubernetes/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,52 @@ func CreateCRDFromYaml(clientset *kubernetes.Clientset, yurtAppManagerClient dyn
return nil
}

func DeleteCRDResource(clientset *kubernetes.Clientset, yurtAppManagerClientSet dynamic.Interface, res string, name string, filebytes []byte) error {
var err error
decoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(filebytes), 10000)
var rawObj k8sruntime.RawExtension
err = decoder.Decode(&rawObj)
if err != nil {
return err
}
obj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil)
if err != nil {
return err
}
unstructuredMap, err := k8sruntime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
return err
}
unstructuredObj := &unstructured.Unstructured{Object: unstructuredMap}
gr, err := restmapper.GetAPIGroupResources(clientset.Discovery())
if err != nil {
return err
}

mapper := restmapper.NewDiscoveryRESTMapper(gr)
mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil {
return err
}

var dri dynamic.ResourceInterface
if mapping.Scope.Name() == meta.RESTScopeNameNamespace {
if unstructuredObj.GetNamespace() == "" {
unstructuredObj.SetNamespace("")
}
dri = yurtAppManagerClientSet.Resource(mapping.Resource).Namespace(unstructuredObj.GetNamespace())
} else {
dri = yurtAppManagerClientSet.Resource(mapping.Resource)
}
err = dri.Delete(context.Background(), name, metav1.DeleteOptions{})
if err != nil {
return err
} else {
fmt.Printf("%s/%s is deleted ", res, name)
}
return nil
}

// YamlToObject deserializes object in yaml format to a runtime.Object
func YamlToObject(yamlContent []byte) (k8sruntime.Object, error) {
decode := serializer.NewCodecFactory(scheme.Scheme).UniversalDeserializer().Decode
Expand Down

0 comments on commit 824816b

Please sign in to comment.