Skip to content

Commit

Permalink
Merge pull request kosmos-io#506 from yuleichun-striving/main
Browse files Browse the repository at this point in the history
modify some codes for coredns and mainfest_components
  • Loading branch information
kosmos-robot authored May 6, 2024
2 parents efd2462 + 88264f6 commit 0eb57c4
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 61 deletions.
2 changes: 1 addition & 1 deletion pkg/kubenest/constants/constant.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ const (
HostPortsCMName = "kosmos-hostports"
HostPortsCMDataName = "config.yaml"

ManifestComponentsConfigmap = "components-manifest-cm"
ManifestComponentsConfigMap = "components-manifest-cm"
NodePoolConfigmap = "node-pool"
NodeVirtualclusterState = "virtualcluster"
NodeFreeState = "free"
Expand Down
3 changes: 2 additions & 1 deletion pkg/kubenest/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ func NewInitPhase(opts *InitOptions, hostPortManager *vcnodecontroller.HostPortM
initPhase.AppendTask(tasks.NewCheckControlPlaneTask())
// create core-dns
initPhase.AppendTask(tasks.NewCoreDNSTask())
initPhase.AppendTask(tasks.NewComponentsFromManifestsTask()) // add server
// add server
initPhase.AppendTask(tasks.NewComponentsFromManifestsTask())

initPhase.SetDataInitializer(func() (workflow.RunData, error) {
return newRunData(opts, hostPortManager)
Expand Down
90 changes: 50 additions & 40 deletions pkg/kubenest/tasks/coredns.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import (

func NewCoreDNSTask() workflow.Task {
return workflow.Task{
Name: "apiserver",
Run: runApiserver,
Name: "coreDns",
Run: runCoreDns,
RunSubTasks: true,
Tasks: []workflow.Task{
{
Expand All @@ -45,8 +45,18 @@ func NewCoreDNSTask() workflow.Task {
}
}

func runCoreDns(r workflow.RunData) error {
data, ok := r.(InitData)
if !ok {
return errors.New("coreDns task invoked with an invalid data struct")
}

klog.V(4).InfoS("[coreDns] Running coreDns task", "virtual cluster", klog.KObj(data))
return nil
}

func getCoreDnsHostComponentsConfig(client clientset.Interface, keyName string) ([]ComponentConfig, error) {
cm, err := client.CoreV1().ConfigMaps(constants.KosmosNs).Get(context.Background(), constants.ManifestComponentsConfigmap, metav1.GetOptions{})
cm, err := client.CoreV1().ConfigMaps(constants.KosmosNs).Get(context.Background(), constants.ManifestComponentsConfigMap, metav1.GetOptions{})
if err != nil {
if apierrors.IsNotFound(err) {
return nil, nil
Expand All @@ -67,41 +77,6 @@ func getCoreDnsHostComponentsConfig(client clientset.Interface, keyName string)
return components, nil
}

func ApplyYMLTemplate(dynamicClient dynamic.Interface, manifestGlob string, templateMapping map[string]interface{}) error {
manifests, err := filepath.Glob(manifestGlob)
klog.V(2).Infof("Component Manifests %s", manifestGlob)
if err != nil {
return err
}
if manifests == nil {
return errors.Errorf("No matching file for pattern %v", manifestGlob)
}
for _, manifest := range manifests {
klog.V(2).Infof("Applying %s", manifest)
var obj unstructured.Unstructured
bytesData, err := os.ReadFile(manifest)
if err != nil {
return errors.Wrapf(err, "Read file %s error", manifest)
}

templateBytes, err := util.ParseTemplate(string(bytesData), templateMapping)
if err != nil {
return errors.Wrapf(err, "Parse template %s error", manifest)
}

err = yaml.Unmarshal(templateBytes, &obj)
if err != nil {
return errors.Wrapf(err, "Unmarshal manifest bytes data error")
}

err = createObject(dynamicClient, obj.GetNamespace(), obj.GetName(), &obj)
if err != nil {
return errors.Wrapf(err, "Create object error")
}
}
return nil
}

// in host
func runCoreDnsHostTask(r workflow.RunData) error {
data, ok := r.(InitData)
Expand All @@ -126,7 +101,7 @@ func runCoreDnsHostTask(r workflow.RunData) error {
"Name": data.GetName(),
"ImageRepository": imageRepository,
}
err = ApplyYMLTemplate(dynamicClient, component.Path, templatedMapping)
err = applyYMLTemplate(dynamicClient, component.Path, templatedMapping)
if err != nil {
return err
}
Expand Down Expand Up @@ -222,10 +197,45 @@ func runCoreDnsVirtualTask(r workflow.RunData) error {
"MetricsPort": MetricsPort,
"HostNodeAddress": HostNodeAddress,
}
err = ApplyYMLTemplate(dynamicClient, component.Path, templatedMapping)
err = applyYMLTemplate(dynamicClient, component.Path, templatedMapping)
if err != nil {
return err
}
}
return nil
}

func applyYMLTemplate(dynamicClient dynamic.Interface, manifestGlob string, templateMapping map[string]interface{}) error {
manifests, err := filepath.Glob(manifestGlob)
klog.V(2).Infof("Component Manifests %s", manifestGlob)
if err != nil {
return err
}
if manifests == nil {
return errors.Errorf("No matching file for pattern %v", manifestGlob)
}
for _, manifest := range manifests {
klog.V(2).Infof("Applying %s", manifest)
var obj unstructured.Unstructured
bytesData, err := os.ReadFile(manifest)
if err != nil {
return errors.Wrapf(err, "Read file %s error", manifest)
}

templateBytes, err := util.ParseTemplate(string(bytesData), templateMapping)
if err != nil {
return errors.Wrapf(err, "Parse template %s error", manifest)
}

err = yaml.Unmarshal(templateBytes, &obj)
if err != nil {
return errors.Wrapf(err, "Unmarshal manifest bytes data error")
}

err = util.CreateObject(dynamicClient, obj.GetNamespace(), obj.GetName(), &obj)
if err != nil {
return errors.Wrapf(err, "Create object error")
}
}
return nil
}
22 changes: 3 additions & 19 deletions pkg/kubenest/tasks/manifests_components.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func runComponentsFromManifests(r workflow.RunData) error {
return errors.New("manifests-components task invoked with an invalid data struct")
}

klog.V(4).InfoS("[apiserver] Running manifests-components task", "virtual cluster", klog.KObj(data))
klog.V(4).InfoS("[manifests-components] Running manifests-components task", "virtual cluster", klog.KObj(data))
return nil
}

Expand Down Expand Up @@ -96,7 +96,7 @@ func applyComponentsManifests(r workflow.RunData) error {
}

func getComponentsConfig(client clientset.Interface) ([]ComponentConfig, error) {
cm, err := client.CoreV1().ConfigMaps(constants.KosmosNs).Get(context.Background(), constants.ManifestComponentsConfigmap, metav1.GetOptions{})
cm, err := client.CoreV1().ConfigMaps(constants.KosmosNs).Get(context.Background(), constants.ManifestComponentsConfigMap, metav1.GetOptions{})
if err != nil {
if apierrors.IsNotFound(err) {
return nil, nil
Expand Down Expand Up @@ -160,26 +160,10 @@ func applyTemplatedManifests(component string, dynamicClient dynamic.Interface,
}
obj = unstructured.Unstructured{Object: res}
}
err = createObject(dynamicClient, obj.GetNamespace(), obj.GetName(), &obj)
err = util.CreateObject(dynamicClient, obj.GetNamespace(), obj.GetName(), &obj)
if err != nil {
return errors.Wrapf(err, "Create object error")
}
}
return nil
}

func createObject(dynamicClient dynamic.Interface, namespace string, name string, obj *unstructured.Unstructured) error {
gvk := obj.GroupVersionKind()
gvr, _ := meta.UnsafeGuessKindToResource(gvk)
klog.V(2).Infof("Create %s, name: %s, namespace: %s", gvr.String(), name, namespace)
_, err := dynamicClient.Resource(gvr).Namespace(namespace).Create(context.TODO(), obj, metav1.CreateOptions{})
if err != nil {
if apierrors.IsAlreadyExists(err) {
klog.Warningf("%s %s already exists", gvr.String(), name)
return nil
} else {
return err
}
}
return nil
}
19 changes: 19 additions & 0 deletions pkg/kubenest/util/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import (
v1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/dynamic"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/klog/v2"
)
Expand Down Expand Up @@ -179,3 +182,19 @@ func CreateOrUpdateClusterRoleBinding(client clientset.Interface, clusterroleBin
klog.V(4).InfoS("Successfully created or updated clusterrolebinding", "clusterrolebinding", clusterroleBinding.GetName)
return nil
}

func CreateObject(dynamicClient dynamic.Interface, namespace string, name string, obj *unstructured.Unstructured) error {
gvk := obj.GroupVersionKind()
gvr, _ := meta.UnsafeGuessKindToResource(gvk)
klog.V(2).Infof("Create %s, name: %s, namespace: %s", gvr.String(), name, namespace)
_, err := dynamicClient.Resource(gvr).Namespace(namespace).Create(context.TODO(), obj, metav1.CreateOptions{})
if err != nil {
if apierrors.IsAlreadyExists(err) {
klog.Warningf("%s %s already exists", gvr.String(), name)
return nil
} else {
return err
}
}
return nil
}

0 comments on commit 0eb57c4

Please sign in to comment.