Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ spec:
priorityClassName: "system-cluster-critical"
containers:
- name: app-service
image: beclab/app-service:0.5.15
image: beclab/app-service:0.5.16
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6755
Expand Down
109 changes: 92 additions & 17 deletions framework/app-service/pkg/apiserver/handler_installer_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ type depRequest struct {
type installHelperIntf interface {
getAdminUsers() (admin []string, isAdmin bool, err error)
getInstalledApps() (installed bool, app []*v1alpha1.Application, err error)
getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (err error)
getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (appConfig *appcfg.ApplicationConfig, err error)
setAppConfig(req *api.InstallRequest, appName string)
validate(bool, []*v1alpha1.Application) error
validate(isAdmin bool, installedApps []*v1alpha1.Application) error
resolveInstallType(appConfig *appcfg.ApplicationConfig) (string, error)
overlayAppConfig(installType string) (*appcfg.ApplicationConfig, error)
setAppEnv(overrides []sysv1alpha1.AppEnvVar) error
applyAppEnv(ctx context.Context) error
applyApplicationManager(marketSource string) (opID string, err error)
Expand Down Expand Up @@ -137,7 +139,7 @@ func (h *Handler) install(req *restful.Request, resp *restful.Response) {
}
}

apiVersion, appCfg, err := apputils.GetApiVersionFromAppConfig(req.Request.Context(), &apputils.ConfigOptions{
apiVersion, err := apputils.GetAppConfigVersion(req.Request.Context(), &apputils.ConfigOptions{
App: app,
RawAppName: rawAppName,
Owner: owner,
Expand All @@ -147,16 +149,13 @@ func (h *Handler) install(req *restful.Request, resp *restful.Response) {
SelectedGpu: insReq.SelectedGpuType,
})
klog.Infof("chartVersion: %s", chartVersion)
klog.Infof("apiVersion: %s", apiVersion)

if err != nil {
klog.Errorf("Failed to get api version err=%v", err)
api.HandleBadRequest(resp, req, err)
return
}
if !appCfg.AllowMultipleInstall && insReq.RawAppName != "" {
klog.Errorf("app %s can not be clone", app)
api.HandleBadRequest(resp, req, fmt.Errorf("app %s can not be clone", app))
return
}

client, err := utils.GetClient()
if err != nil {
Expand Down Expand Up @@ -221,11 +220,31 @@ func (h *Handler) install(req *restful.Request, resp *restful.Response) {
return
}

err = helper.getAppConfig(adminUsers, marketSource, isAdmin, appInstalled, installedApps, chartVersion, insReq.SelectedGpuType)
appCfg, err := helper.getAppConfig(adminUsers, marketSource, isAdmin, appInstalled, installedApps, chartVersion, insReq.SelectedGpuType)
if err != nil {
klog.Errorf("Failed to get app config err=%v", err)
return
}
if !appCfg.AllowMultipleInstall && insReq.RawAppName != "" {
klog.Errorf("app %s can not be clone", app)
api.HandleBadRequest(resp, req, fmt.Errorf("app %s can not be clone", app))
return
}

installType, err := helper.resolveInstallType(appCfg)
if err != nil {
klog.Errorf("Failed to resolve install type err=%v", err)
api.HandleError(resp, req, err)
return
}

appCfg, err = helper.overlayAppConfig(installType)
if err != nil {
klog.Errorf("Failed to overlay app config err=%v", err)
api.HandleError(resp, req, err)
return
}

err = helper.setAppEnv(insReq.Envs)
if err != nil {
klog.Errorf("Failed to set app env err=%v", err)
Expand Down Expand Up @@ -274,6 +293,29 @@ func (h *Handler) getOriginChartVersion(rawAppName, owner string) (string, error
return "", fmt.Errorf("rawApp %s not found", rawAppName)
}

func (h *installHandlerHelper) sharedNamespaceExists(appConfig *appcfg.ApplicationConfig) (bool, error) {
sharedNamespace := ""
for _, s := range appConfig.SubCharts {
if s.Shared {
sharedNamespace = s.Namespace(appConfig.OwnerName, s.Name)
Comment thread
hysyeah marked this conversation as resolved.
break
}
}
if sharedNamespace == "" {
return false, errors.New("v2 app has no shared namespace")
}

var ns corev1.Namespace
err := h.h.ctrlClient.Get(context.TODO(), types.NamespacedName{Name: sharedNamespace}, &ns)
if err != nil {
if apierrors.IsNotFound(err) {
return false, nil
}
return false, err
}
return true, nil
}

func (h *installHandlerHelper) getAdminUsers() (admin []string, isAdmin bool, err error) {
adminList, err := kubesphere.GetAdminUserList(h.req.Request.Context(), h.h.kubeConfig)
if err != nil {
Expand All @@ -291,6 +333,20 @@ func (h *installHandlerHelper) getAdminUsers() (admin []string, isAdmin bool, er
return
}

func (h *installHandlerHelper) resolveInstallType(appConfig *appcfg.ApplicationConfig) (string, error) {
if appConfig.APIVersion == appcfg.V1 || appConfig.APIVersion == "" {
return appcfg.InstallOrUpgradeV1, nil
}
exists, err := h.sharedNamespaceExists(appConfig)
if err != nil {
return "", err
}
if !exists {
return appcfg.InstallOrUpgradeClientAndServer, nil
}
return appcfg.InstallOrUpgradeClientOnly, nil
}
Comment thread
hysyeah marked this conversation as resolved.

func (h *installHandlerHelper) validate(isAdmin bool, installedApps []*v1alpha1.Application) (err error) {
unSatisfiedDeps, err := CheckDependencies(h.req.Request.Context(), h.appConfig.Dependencies, h.h.ctrlClient, h.owner, true)

Expand Down Expand Up @@ -374,7 +430,6 @@ func (h *installHandlerHelper) validate(isAdmin bool, installedApps []*v1alpha1.
return
}

//resourceType, err := CheckAppRequirement(h.h.kubeConfig, h.token, h.appConfig)
resourceType, resourceConditionType, err := apputils.CheckAppRequirement(h.token, h.appConfig, v1alpha1.InstallOp)
if err != nil {
klog.Errorf("Failed to check app requirement err=%v", err)
Expand Down Expand Up @@ -456,7 +511,7 @@ func (h *installHandlerHelper) getInstalledApps() (installed bool, app []*v1alph
return
}

func (h *installHandlerHelper) getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (err error) {
func (h *installHandlerHelper) getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (appConfig *appcfg.ApplicationConfig, err error) {
var (
admin string
installAsAdmin bool
Expand Down Expand Up @@ -486,7 +541,8 @@ func (h *installHandlerHelper) getAppConfig(adminUsers []string, marketSource st
case !isAdmin:
if len(adminUsers) == 0 {
klog.Errorf("No admin user found")
api.HandleBadRequest(h.resp, h.req, fmt.Errorf("no admin user found"))
err = fmt.Errorf("no admin user found")
api.HandleBadRequest(h.resp, h.req, err)
return
}
admin = adminUsers[0]
Expand All @@ -496,7 +552,7 @@ func (h *installHandlerHelper) getAppConfig(adminUsers []string, marketSource st
installAsAdmin = true
}

appConfig, _, err := apputils.GetAppConfig(h.req.Request.Context(), &apputils.ConfigOptions{
appConfig, _, err = apputils.GetAppConfig(h.req.Request.Context(), &apputils.ConfigOptions{
App: h.app,
RawAppName: h.rawAppName,
Owner: h.owner,
Expand All @@ -518,6 +574,25 @@ func (h *installHandlerHelper) getAppConfig(adminUsers []string, marketSource st
return
}

func (h *installHandlerHelper) overlayAppConfig(installType string) (*appcfg.ApplicationConfig, error) {
if h.appConfig == nil {
return nil, fmt.Errorf("app config is nil")
}
if !config.IsNewManifestVersion(h.appConfig.CfgFileVersion) {
return h.appConfig, nil
}

h.appConfig.ApplyOverlay(installType)

appRequirement, err := h.appConfig.ResolveRequirement(h.appConfig.SelectedGpuType, installType)
if err != nil {
return nil, fmt.Errorf("resolve requirement: %w", err)
}
h.appConfig.Requirement = *appRequirement

return h.appConfig, nil
}

func (h *installHandlerHelper) setAppConfig(req *api.InstallRequest, appName string) {
h.appConfig.AppName = appName
h.appConfig.RawAppName = appName
Expand Down Expand Up @@ -716,7 +791,7 @@ func (h *installHandlerHelperV2) _validateClusterScope(isAdmin bool, installedAp
return nil
}

func (h *installHandlerHelperV2) getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (err error) {
func (h *installHandlerHelperV2) getAppConfig(adminUsers []string, marketSource string, isAdmin, appInstalled bool, installedApps []*v1alpha1.Application, chartVersion, selectedGpuType string) (appConfig *appcfg.ApplicationConfig, err error) {
klog.Info("get app config for install handler v2")

var (
Expand All @@ -728,13 +803,13 @@ func (h *installHandlerHelperV2) getAppConfig(adminUsers []string, marketSource
} else {
if len(adminUsers) == 0 {
klog.Errorf("No admin user found")
api.HandleBadRequest(h.resp, h.req, fmt.Errorf("no admin user found"))
err = fmt.Errorf("no admin user found")
api.HandleBadRequest(h.resp, h.req, err)
return
}
admin = adminUsers[0]
}

appConfig, _, err := apputils.GetAppConfig(h.req.Request.Context(), &apputils.ConfigOptions{
appConfig, _, err = apputils.GetAppConfig(h.req.Request.Context(), &apputils.ConfigOptions{
App: h.app,
RawAppName: h.rawAppName,
Owner: h.owner,
Expand Down
58 changes: 48 additions & 10 deletions framework/app-service/pkg/apiserver/handler_installer_upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ import (

type upgradeHelperIntf interface {
getAdminUsers() (admin []string, isAdmin bool, err error)
getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, isAdmin bool) (err error)
getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, isAdmin bool) (appConfig *appcfg.ApplicationConfig, err error)
validate() error
applyAppEnv(ctx context.Context) error
setAndEncodingAppCofnig(prevCfg *appcfg.ApplicationConfig) (string, error)
resolveUpgradeType(appConfig *appcfg.ApplicationConfig, isAdmin bool) string
overlayAppConfig(upgradeType string) (*appcfg.ApplicationConfig, error)
}

var _ upgradeHelperIntf = (upgradeHelperIntf)(nil)
Expand Down Expand Up @@ -70,7 +72,7 @@ func (h *upgradeHandlerHelper) getAdminUsers() (admins []string, isAdmin bool, e
return
}

func (h *upgradeHandlerHelper) getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, _ bool) (err error) {
func (h *upgradeHandlerHelper) getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, _ bool) (*appcfg.ApplicationConfig, error) {
var admin string
if !prevCfg.AppScope.ClusterScoped {
// installed as non-admin
Expand Down Expand Up @@ -101,11 +103,11 @@ func (h *upgradeHandlerHelper) getAppConfig(prevCfg *appcfg.ApplicationConfig, a
})
if err != nil {
api.HandleError(h.resp, h.req, err)
return
return nil, err
}

h.appConfig = appConfig
return nil
return appConfig, nil
}

func (h *upgradeHandlerHelper) validate() error {
Expand Down Expand Up @@ -174,13 +176,13 @@ func (h *upgradeHandlerHelper) applyAppEnv(ctx context.Context) (err error) {
return
}

func (h *upgradeHandlerHelperV2) getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, isAdmin bool) (err error) {
func (h *upgradeHandlerHelperV2) getAppConfig(prevCfg *appcfg.ApplicationConfig, adminUsers []string, marketSource string, isAdmin bool) (*appcfg.ApplicationConfig, error) {
klog.Info("Getting app config for V2")
if len(adminUsers) == 0 {
err := fmt.Errorf("no admin users found")
klog.Error(err)
api.HandleError(h.resp, h.req, err)
return err
return nil, err
}

var admin string
Expand All @@ -204,12 +206,40 @@ func (h *upgradeHandlerHelperV2) getAppConfig(prevCfg *appcfg.ApplicationConfig,
})
if err != nil {
api.HandleError(h.resp, h.req, err)
return
return nil, err
}

h.appConfig = appConfig

return nil
return appConfig, nil
}

func (h *upgradeHandlerHelper) resolveUpgradeType(appConfig *appcfg.ApplicationConfig, isAdmin bool) string {
if appConfig.APIVersion == appcfg.V1 || appConfig.APIVersion == "" {
return appcfg.InstallOrUpgradeV1
}
if isAdmin {
return appcfg.InstallOrUpgradeClientAndServer
}
return appcfg.InstallOrUpgradeClientOnly
}

func (h *upgradeHandlerHelper) overlayAppConfig(upgradeType string) (*appcfg.ApplicationConfig, error) {
if h.appConfig == nil {
return nil, fmt.Errorf("app config is nil")
}
if !config.IsNewManifestVersion(h.appConfig.CfgFileVersion) {
return h.appConfig, nil
}
h.appConfig.ApplyOverlay(upgradeType)

appRequirement, err := h.appConfig.ResolveRequirement(h.appConfig.SelectedGpuType, upgradeType)
if err != nil {
return nil, fmt.Errorf("resolve requirement: %w", err)
}
h.appConfig.Requirement = *appRequirement

return h.appConfig, nil
}

func (h *Handler) appUpgrade(req *restful.Request, resp *restful.Response) {
Expand Down Expand Up @@ -267,7 +297,7 @@ func (h *Handler) appUpgrade(req *restful.Request, resp *restful.Response) {
if appMgr.Spec.RawAppName != "" {
rawAppName = appMgr.Spec.RawAppName
}
apiVersion, _, err := apputils.GetApiVersionFromAppConfig(req.Request.Context(), &apputils.ConfigOptions{
apiVersion, err := apputils.GetAppConfigVersion(req.Request.Context(), &apputils.ConfigOptions{
App: app,
RawAppName: rawAppName,
Owner: owner,
Expand Down Expand Up @@ -332,11 +362,19 @@ func (h *Handler) appUpgrade(req *restful.Request, resp *restful.Response) {
return
}

err = helper.getAppConfig(&prevCfg, adminUsers, marketSource, isAdmin)
appConfig, err := helper.getAppConfig(&prevCfg, adminUsers, marketSource, isAdmin)
if err != nil {
klog.Errorf("Failed to get app config err=%v", err)
return
}
upgradeType := helper.resolveUpgradeType(appConfig, isAdmin)

appConfig, err = helper.overlayAppConfig(upgradeType)
if err != nil {
klog.Errorf("Failed to get overlay config err=%v", err)
api.HandleError(resp, req, err)
return
}
Comment thread
cursor[bot] marked this conversation as resolved.

err = helper.validate()
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions framework/app-service/pkg/apiserver/handler_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,8 @@ func (h *Handler) getGPUResourceTypeKey(gpuType string) string {
return constants.AMDGPU
case utils.StrixHaloChipType:
return constants.AMDGPU
case utils.MthreadsM100ChipType:
return ""
case utils.CPUType:
klog.Info("CPU type is selected, no GPU resource will be injected")
return ""
Expand Down
Loading
Loading