Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: deploy modules to different namespaces #402

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cyclops-ctrl/config/samples/cyclops_v1alpha1_module.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ metadata:
app.kubernetes.io/managed-by: kustomize
app.kubernetes.io/created-by: kubebuilder
name: module-sample
namespace: desired-namespace # else it will be default
spec:
# TODO(user): Add fields here
27 changes: 16 additions & 11 deletions cyclops-ctrl/internal/cluster/k8sclient/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,31 +32,36 @@ func (k *KubernetesClient) ListModules() ([]cyclopsv1alpha1.Module, error) {
}

func (k *KubernetesClient) CreateModule(module cyclopsv1alpha1.Module) error {
_, err := k.moduleset.Modules(cyclopsNamespace).Create(&module)
_, err := k.moduleset.Modules(module.Namespace).Create(&module)
return err
}

func (k *KubernetesClient) UpdateModule(module *cyclopsv1alpha1.Module) error {
_, err := k.moduleset.Modules(cyclopsNamespace).Update(module)
_, err := k.moduleset.Modules(module.Namespace).Update(module)
return err
}

func (k *KubernetesClient) UpdateModuleStatus(module *cyclopsv1alpha1.Module) (*cyclopsv1alpha1.Module, error) {
return k.moduleset.Modules(cyclopsNamespace).PatchStatus(module)
return k.moduleset.Modules(module.Namespace).PatchStatus(module)
}

func (k *KubernetesClient) DeleteModule(name string) error {
return k.moduleset.Modules(cyclopsNamespace).Delete(name)
func (k *KubernetesClient) DeleteModule(name, namespace string) error {
return k.moduleset.Modules(namespace).Delete(name)
}

func (k *KubernetesClient) GetModule(name string) (*cyclopsv1alpha1.Module, error) {
return k.moduleset.Modules(cyclopsNamespace).Get(name)
func (k *KubernetesClient) GetModule(name, namespace string) (*cyclopsv1alpha1.Module, error) {
return k.moduleset.Modules(namespace).Get(name)
}

func (k *KubernetesClient) GetResourcesForModule(name string) ([]dto.Resource, error) {
func (k *KubernetesClient) GetResourcesForModule(name, namespace string) ([]dto.Resource, error) {
out := make([]dto.Resource, 0, 0)

managedGVRs, err := k.getManagedGVRs(name)
module, err := k.GetModule(name, namespace)
if err != nil {
return nil, err
}

managedGVRs, err := k.getManagedGVRs(module.Name, namespace)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -103,8 +108,8 @@ func (k *KubernetesClient) GetResourcesForModule(name string) ([]dto.Resource, e
return out, nil
}

func (k *KubernetesClient) getManagedGVRs(moduleName string) ([]schema.GroupVersionResource, error) {
module, _ := k.GetModule(moduleName)
func (k *KubernetesClient) getManagedGVRs(moduleName, namespace string) ([]schema.GroupVersionResource, error) {
module, _ := k.GetModule(moduleName, namespace)

if module != nil && len(module.Status.ManagedGVRs) != 0 {
existing := make([]schema.GroupVersionResource, 0, len(module.Status.ManagedGVRs))
Expand Down
18 changes: 9 additions & 9 deletions cyclops-ctrl/internal/controller/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func NewModulesController(
func (m *Modules) GetModule(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.Status(http.StatusInternalServerError)
Expand Down Expand Up @@ -92,7 +92,7 @@ func (m *Modules) ListModules(ctx *gin.Context) {
func (m *Modules) DeleteModule(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

err := m.kubernetesClient.DeleteModule(ctx.Param("name"))
err := m.kubernetesClient.DeleteModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.JSON(http.StatusInternalServerError, dto.NewError("Error deleting module", err.Error()))
Expand All @@ -106,7 +106,7 @@ func (m *Modules) DeleteModule(ctx *gin.Context) {
func (m *Modules) GetModuleHistory(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.Status(http.StatusInternalServerError)
Expand Down Expand Up @@ -166,7 +166,7 @@ func (m *Modules) Manifest(ctx *gin.Context) {
func (m *Modules) CurrentManifest(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.Status(http.StatusInternalServerError)
Expand Down Expand Up @@ -257,7 +257,7 @@ func (m *Modules) UpdateModule(ctx *gin.Context) {
return
}

curr, err := m.kubernetesClient.GetModule(request.Name)
curr, err := m.kubernetesClient.GetModule(request.Name, request.Namespace)
if err != nil {
fmt.Println(err)
ctx.JSON(http.StatusInternalServerError, dto.NewError("Error fetching module", err.Error()))
Expand Down Expand Up @@ -318,7 +318,7 @@ func (m *Modules) UpdateModule(ctx *gin.Context) {
func (m *Modules) ResourcesForModule(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
ctx.JSON(http.StatusBadRequest, dto.NewError("Error mapping module request", err.Error()))
return
Expand All @@ -339,7 +339,7 @@ func (m *Modules) ResourcesForModule(ctx *gin.Context) {
return
}

resources, err := m.kubernetesClient.GetResourcesForModule(ctx.Param("name"))
resources, err := m.kubernetesClient.GetResourcesForModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.JSON(http.StatusInternalServerError, dto.NewError("Error fetching module resources", err.Error()))
Expand All @@ -366,7 +366,7 @@ func (m *Modules) ResourcesForModule(ctx *gin.Context) {
func (m *Modules) Template(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.JSON(http.StatusInternalServerError, dto.NewError("Error fetching module", err.Error()))
Expand Down Expand Up @@ -420,7 +420,7 @@ func (m *Modules) Template(ctx *gin.Context) {
func (m *Modules) HelmTemplate(ctx *gin.Context) {
ctx.Header("Access-Control-Allow-Origin", "*")

module, err := m.kubernetesClient.GetModule(ctx.Param("name"))
module, err := m.kubernetesClient.GetModule(ctx.Param("name"), ctx.Param("namespace"))
if err != nil {
fmt.Println(err)
ctx.JSON(http.StatusInternalServerError, dto.NewError("Error fetching module", err.Error()))
Expand Down
20 changes: 10 additions & 10 deletions cyclops-ctrl/internal/handler/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,16 @@ func (h *Handler) Start() error {
// modules
h.router.GET("/modules/:name", modulesController.GetModule)
h.router.GET("/modules/list", modulesController.ListModules)
h.router.DELETE("/modules/:name", modulesController.DeleteModule)
h.router.POST("/modules/new", modulesController.CreateModule)
h.router.POST("/modules/update", modulesController.UpdateModule)
h.router.GET("/modules/:name/history", modulesController.GetModuleHistory)
h.router.POST("/modules/:name/manifest", modulesController.Manifest)
h.router.GET("/modules/:name/currentManifest", modulesController.CurrentManifest)
h.router.GET("/modules/:name/resources", modulesController.ResourcesForModule)
h.router.DELETE("/modules/:name/resources", modulesController.DeleteModuleResource)
h.router.GET("/modules/:name/template", modulesController.Template)
h.router.GET("/modules/:name/helm-template", modulesController.HelmTemplate)
h.router.GET("/modules/:namespace/:name", modulesController.GetModule)
h.router.GET("/modules/:namespace/:name/history", modulesController.GetModuleHistory)
h.router.POST("/modules/:namespace/:name/manifest", modulesController.Manifest)
h.router.GET("/modules/:namespace/:name/currentManifest", modulesController.CurrentManifest)
h.router.GET("/modules/:namespace/:name/resources", modulesController.ResourcesForModule)
h.router.DELETE("/modules/:namespace/:name", modulesController.DeleteModule)
h.router.DELETE("/modules/:namespace/:name/resources", modulesController.DeleteModuleResource)
h.router.GET("/modules/:namespace/:name/template", modulesController.Template)
h.router.GET("/modules/:namespace/:name/helm-template", modulesController.HelmTemplate)

//h.router.POST("/modules/resources", modulesController.ModuleToResources)

h.router.GET("/resources/pods/:namespace/:name/:container/logs", modulesController.GetLogs)
Expand Down
3 changes: 2 additions & 1 deletion cyclops-ctrl/internal/mapper/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ func RequestToModule(req dto.Module) (cyclopsv1alpha1.Module, error) {
APIVersion: "cyclops-ui.com/v1alpha1",
},
ObjectMeta: metav1.ObjectMeta{
Name: req.Name,
Name: req.Name,
Namespace: req.Namespace,
},
Spec: cyclopsv1alpha1.ModuleSpec{
TemplateRef: DtoTemplateRefToK8s(req.Template),
Expand Down
15 changes: 10 additions & 5 deletions cyclops-ctrl/internal/modulecontroller/module_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
err := r.Get(ctx, req.NamespacedName, &module)
if apierrors.IsNotFound(err) {
r.logger.Info("delete module", "namespaced name", req.NamespacedName)
resources, err := r.kubernetesClient.GetResourcesForModule(req.Name)
resources, err := r.kubernetesClient.GetResourcesForModule(req.Name, req.Namespace)
if err != nil {
r.logger.Error(err, "error on get module resources", "namespaced name", req.NamespacedName)
return ctrl.Result{}, err
Expand Down Expand Up @@ -144,7 +144,7 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
return ctrl.Result{}, err
}

installErrors, childrenResources, err := r.moduleToResources(req.Name, template)
installErrors, childrenResources, err := r.moduleToResources(req.Name, req.Namespace, template)
if err != nil {
r.logger.Error(err, "error on upsert module", "namespaced name", req.NamespacedName)

Expand Down Expand Up @@ -194,15 +194,15 @@ func (r *ModuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
Complete(r)
}

func (r *ModuleReconciler) moduleToResources(name string, template *models.Template) ([]string, []cyclopsv1alpha1.GroupVersionResource, error) {
module, err := r.kubernetesClient.GetModule(name)
func (r *ModuleReconciler) moduleToResources(name, namespace string, template *models.Template) ([]string, []cyclopsv1alpha1.GroupVersionResource, error) {
module, err := r.kubernetesClient.GetModule(name, namespace)
if err != nil {
return nil, nil, err
}

crdInstallErrors := r.applyCRDs(template)

installErrors, childrenGVRs, err := r.generateResources(r.kubernetesClient, *module, template)
installErrors, childrenGVRs, err := r.generateResources(r.kubernetesClient, *module, template, namespace)
if err != nil {
return nil, nil, err
}
Expand All @@ -214,6 +214,7 @@ func (r *ModuleReconciler) generateResources(
kClient *k8sclient.KubernetesClient,
module cyclopsv1alpha1.Module,
moduleTemplate *models.Template,
namespace string,
) ([]string, []cyclopsv1alpha1.GroupVersionResource, error) {
out, err := r.renderer.HelmTemplate(module, moduleTemplate)
if err != nil {
Expand Down Expand Up @@ -241,6 +242,10 @@ func (r *ModuleReconciler) generateResources(
fmt.Sprintf("%s/%s", obj.GetNamespace(), obj.GetName()),
)

if obj.GetNamespace() == "" {
obj.SetNamespace(namespace)
}

installErrors = append(installErrors, fmt.Sprintf(
"%v%v/%v %v/%v failed to decode: %v",
obj.GroupVersionKind().Group,
Expand Down
16 changes: 11 additions & 5 deletions cyclops-ui/src/components/pages/EditModule/EditModule.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,15 @@ const layout = {

interface module {
name: string;
namespace: string,
values: any;
template: templateRef;
}

const EditModule = () => {
const [module, setModule] = useState<module>({
name: "",
namespace: "",
values: {},
template: {
repo: "",
Expand Down Expand Up @@ -134,6 +136,7 @@ const EditModule = () => {
const history = useNavigate();

let { moduleName } = useParams();
let { moduleNamespace } = useParams();

const mapsToArray = useCallback((fields: any[], values: any): any => {
let out: any = {};
Expand Down Expand Up @@ -220,7 +223,7 @@ const EditModule = () => {
useEffect(() => {
const fetchModuleData = async () => {
axios
.get("/api/modules/" + moduleName)
.get("/api/modules/" + moduleNamespace + "/" + moduleName)
.then(async (res) => {
editTemplateForm.setFieldsValue({
repo: res.data.template.repo,
Expand Down Expand Up @@ -251,6 +254,7 @@ const EditModule = () => {

setModule({
name: res.data.name,
namespace: res.data.namespace,
values: values,
template: res.data.template,
});
Expand All @@ -271,7 +275,7 @@ const EditModule = () => {
});
};
fetchModuleData();
}, [editTemplateForm, form, moduleName, mapsToArray]);
}, [editTemplateForm, form, moduleName,moduleNamespace, mapsToArray]);

useEffect(() => {
form.validateFields(flattenObjectKeys(values));
Expand Down Expand Up @@ -392,10 +396,11 @@ const EditModule = () => {
.post(`/api/modules/update`, {
values: values,
name: module.name,
namespace: module.namespace,
template: templateRef,
})
.then((res) => {
window.location.href = "/modules/" + moduleName;
window.location.href = "/modules/" + moduleNamespace + "/" + moduleName;
})
.catch((error) => {
setError(mapResponseError(error));
Expand Down Expand Up @@ -1105,8 +1110,9 @@ const EditModule = () => {
</Button>{" "}
<Button
htmlType="button"
onClick={() => history("/modules/" + moduleName)}
disabled={!loadTemplate}
onClick={() =>
history("/modules/" + moduleNamespace + "/" + moduleName)
}
>
Back
</Button>
Expand Down
31 changes: 21 additions & 10 deletions cyclops-ui/src/components/pages/History.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ const ModuleHistory = () => {
const [historyEntries, setHistoryEntries] = useState([]);

let { moduleName } = useParams();
let { moduleNamespace } = useParams();

useEffect(() => {
axios.get(`/api/modules/` + moduleName + `/history`).then((res) => {
console.log(res.data);
Expand Down Expand Up @@ -63,10 +65,11 @@ const ModuleHistory = () => {
.post(`/api/modules/update`, {
values: target.values,
name: moduleName,
namespace: moduleNamespace,
template: target.template,
})
.then((res) => {
window.location.href = "/modules/" + moduleName;
window.location.href = "/modules/" + moduleNamespace + "/" + moduleName;
})
.catch((error) => {
// setLoading(false);
Expand Down Expand Up @@ -104,10 +107,13 @@ const ModuleHistory = () => {
});

axios
.post("/api/modules/" + moduleName + "/manifest", {
template: target.template,
values: target.values,
})
.post(
"/api/modules/" + moduleNamespace + "/" + moduleName + "/manifest",
{
template: target.template,
values: target.values,
},
)
.then(function (res) {
setDiff({
curr: diff.curr,
Expand All @@ -133,10 +139,13 @@ const ModuleHistory = () => {
});

axios
.post("/api/modules/" + moduleName + "/manifest", {
template: target.template,
values: target.values,
})
.post(
"/api/modules/" + moduleNamespace + "/" + moduleName + "/manifest",
{
template: target.template,
values: target.values,
},
)
.then(function (res) {
setManifest(res.data);
})
Expand Down Expand Up @@ -266,7 +275,9 @@ const ModuleHistory = () => {
<Button
style={{ float: "right" }}
htmlType="button"
onClick={() => history("/modules/" + moduleName)}
onClick={() =>
history("/modules/" + moduleNamespace + "/" + moduleName)
}
>
Back
</Button>
Expand Down
Loading
Loading