提交 8a930de0 编写于 作者: 叶飞

1. support all normal docker registry

2. support insecure & secure registry endpoint
3. change 'harbor' to 'registry'
上级 758a48e9
......@@ -16,7 +16,7 @@ AtomCI 致力于让中小企业快速落地Kubernetes,代码均已开源, __
├──────► ├────► │ │ └────────────────┘ │
┌──────────┐ │ │ │ │ ├───► │
│ │ │ │ Backend (Go) ◄────┤ Jenkins │ │ ┌────────────────┐ │
Harbor ├─────┤ │ │ │ │ │ │ jnlp-agent pod2│ │
Registry ├─────┤ │ │ │ │ │ │ jnlp-agent pod2│ │
│ │ │ │ │ │ │ │ └────────────────┘ │
└──────────┘ │ └──────────┬────────────┘ │ │ │ .... │
│ │ │ │ │ ┌────────────────┐ │
......
......@@ -288,7 +288,7 @@ func (ar *AppRes) InstallApp(
template Template,
eparam *ExtensionParam) error {
CreateK8sNamespace(ar.Cluster, namespace)
CreateHarborSecret(ar.Cluster, namespace, ar.EnvID)
CreateRegistrySecret(ar.Cluster, namespace, ar.EnvID)
if err := template.Validate(); err != nil {
return errors.NewBadRequest().SetCause(err)
}
......@@ -504,45 +504,45 @@ func CreateK8sNamespace(cluster, namespace string) error {
return nil
}
func CreateHarborSecret(cluster, namespace string, envID int64) error {
func CreateRegistrySecret(cluster, namespace string, envID int64) error {
client, err := kube.GetClientset(cluster)
if err != nil {
log.Log.Warning(fmt.Sprintf("create harbor secret failed: %v", err.Error()))
log.Log.Warning(fmt.Sprintf("create registry secret failed: %v", err.Error()))
return err
}
// TODO: refactor code combine
projectEnv, err := dao.NewProjectModel().GetProjectEnvByID(envID)
if err != nil {
log.Log.Error("when create harbor secret get project env by id: %v, error: %s", envID, err.Error())
log.Log.Error("when create registry secret get project env by id: %v, error: %s", envID, err.Error())
return err
}
integrateSettingHarbor, err := settings.NewSettingManager().GetIntegrateSettingByID(projectEnv.Harbor)
integrateSettingRegistry, err := settings.NewSettingManager().GetIntegrateSettingByID(projectEnv.Registry)
if err != nil {
log.Log.Error("when create harbor secret get integrate setting by id: %v, error: %s", projectEnv.Harbor, err.Error())
log.Log.Error("when create registry secret get integrate setting by id: %v, error: %s", projectEnv.Registry, err.Error())
return err
}
var harborAddr, harborUser, harborPassword, harborAuth string
harborName := integrateSettingHarbor.Name
if harborConf, ok := integrateSettingHarbor.Config.(*settings.HarborConfig); ok {
harborAddr = harborConf.URL
harborPassword = harborConf.Password
harborUser = harborConf.User
harborAuth = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%v:%v", harborConf.User, harborConf.Password)))
var registryAddr, registryUser, registryPassword, registryAuth string
registryName := strings.ToLower(integrateSettingRegistry.Name)
if registryConf, ok := integrateSettingRegistry.Config.(*settings.RegistryConfig); ok {
registryAddr = registryConf.URL
registryPassword = registryConf.Password
registryUser = registryConf.User
registryAuth = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%v:%v", registryConf.User, registryConf.Password)))
} else {
log.Log.Error("parse integrate setting harbor config error")
return fmt.Errorf("parse integrate setting harbor config error")
log.Log.Error("parse integrate setting registry config error")
return fmt.Errorf("parse integrate setting registry config error")
}
harborSecretName := fmt.Sprintf("harbor-%v", harborName)
harborInfo := make(map[string]interface{})
harborInfo[harborAddr] = map[string]string{
"username": harborUser,
"password": harborPassword,
"auth": harborAuth,
registrySecretName := fmt.Sprintf("registry-%v", registryName)
registryInfo := make(map[string]interface{})
registryInfo[registryAddr] = map[string]string{
"username": registryUser,
"password": registryPassword,
"auth": registryAuth,
}
auth, _ := json.Marshal(harborInfo)
harborSec, err := client.CoreV1().Secrets(namespace).Get(harborSecretName, metav1.GetOptions{})
auth, _ := json.Marshal(registryInfo)
registrySec, err := client.CoreV1().Secrets(namespace).Get(registrySecretName, metav1.GetOptions{})
if err != nil {
if !k8serrors.IsNotFound(err) {
return err
......@@ -550,7 +550,7 @@ func CreateHarborSecret(cluster, namespace string, envID int64) error {
_, err = client.CoreV1().Secrets(namespace).Create(&apiv1.Secret{
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: harborSecretName,
Name: registrySecretName,
},
Type: apiv1.SecretTypeDockercfg,
Data: map[string][]byte{
......@@ -558,14 +558,14 @@ func CreateHarborSecret(cluster, namespace string, envID int64) error {
},
})
} else {
if string(harborSec.Data[".dockercfg"]) == string(auth) {
if string(registrySec.Data[".dockercfg"]) == string(auth) {
return nil
}
harborSec.Data = map[string][]byte{".dockercfg": auth}
_, err = client.CoreV1().Secrets(namespace).Update(harborSec)
registrySec.Data = map[string][]byte{".dockercfg": auth}
_, err = client.CoreV1().Secrets(namespace).Update(registrySec)
}
if err != nil {
log.Log.Warning(fmt.Sprintf("set harbor secret failed: %v", err.Error()))
log.Log.Warning(fmt.Sprintf("set registry secret failed: %v", err.Error()))
}
return err
}
......
......@@ -18,6 +18,7 @@ package kuberes
import (
"fmt"
"strings"
"github.com/go-atomci/atomci/core/settings"
"github.com/go-atomci/atomci/dao"
......@@ -136,26 +137,27 @@ func (wk *DeployWorker) deleteApplication(appname string) {
}
}
func getDefaultPullSecretAndHarborAddr(envID int64) (string, string, error) {
func getDefaultPullSecretAndRegistryAddr(envID int64) (string, string, error) {
projectEnv, err := dao.NewProjectModel().GetProjectEnvByID(envID)
if err != nil {
log.Log.Error("when create harbor secret get project env by id: %v, error: %s", envID, err.Error())
log.Log.Error("when create registry secret get project env by id: %v, error: %s", envID, err.Error())
return "", "", err
}
integrateSettingHarbor, err := dao.NewSysSettingModel().GetIntegrateSettingByID(projectEnv.Harbor)
integrateSettingRegistry, err := dao.NewSysSettingModel().GetIntegrateSettingByID(projectEnv.Registry)
if err != nil {
log.Log.Error("when create harbor secret get integrate setting by id: %v, error: %s", projectEnv.Harbor, err.Error())
log.Log.Error("when create registry secret get integrate setting by id: %v, error: %s", projectEnv.Registry, err.Error())
return "", "", err
}
config := settings.Config{}
configJSON, err := config.Struct(integrateSettingHarbor.Config, integrateSettingHarbor.Type)
configJSON, err := config.Struct(integrateSettingRegistry.Config, integrateSettingRegistry.Type)
if err != nil {
log.Log.Error("when parse harbor config error: %s", err.Error())
log.Log.Error("when parse registry config error: %s", err.Error())
return "", "", err
}
var url string
if harborConf, ok := configJSON.(*settings.HarborConfig); ok {
url = harborConf.URL
if registryConf, ok := configJSON.(*settings.RegistryConfig); ok {
url = registryConf.URL
}
return "harbor-" + integrateSettingHarbor.Name, url, nil
return "registry-" + strings.ToLower(integrateSettingRegistry.Name), url, nil
}
......@@ -233,7 +233,7 @@ func (tp *NativeAppTemplate) newPodTemplateSpec(spec apiv1.PodTemplateSpec, podV
}
IncludeEnvImage := false
for _, item := range podContainers {
if strings.Contains(item.Image, tp.Config.HarborAddr) {
if strings.Contains(item.Image, tp.Config.RegistryAddr) {
IncludeEnvImage = true
break
}
......
......@@ -72,7 +72,7 @@ type DeployConfig struct {
DefaultPort int32 `json:"default_port"` //默认服务端口
DeployStrategy string `json:"deploy_strategy"`
ImagePullSecret string `json:"image_pull_secret"`
HarborAddr string `json:"harbor_addr"`
RegistryAddr string `json:"registry_addr"`
Description string `json:"description"`
}
......@@ -89,12 +89,12 @@ func NewNativeTemplate() *NativeTemplate {
// set default value for template config
func (t *NativeTemplate) Default(envID int64) Template {
if t.Config.ImagePullSecret == "" && envID != 0 {
defSecret, harborURL, err := getDefaultPullSecretAndHarborAddr(envID)
defSecret, registryURL, err := getDefaultPullSecretAndRegistryAddr(envID)
if err != nil {
log.Log.Error("get default pull secret failed:", err)
}
t.Config.ImagePullSecret = defSecret
t.Config.HarborAddr = harborURL
t.Config.RegistryAddr = registryURL
}
return t
}
......
......@@ -235,7 +235,7 @@ func (pm *PipelineManager) CreateBuildJob(creator string, projectID, publishID i
log.Log.Error("getDeployInfo occur error: %s", err.Error())
return 0, "", err
}
if len(deployInfo) != 3 {
if len(deployInfo) != 4 {
log.Log.Error("deploy info is validate, len: %v", len(deployInfo))
}
// Create publishJob publishJobApps
......@@ -1039,7 +1039,7 @@ func (pm *PipelineManager) renderAppBuildItemsForBuild(projectID, stageID, publi
func (pm *PipelineManager) renderAppImageitemsForBuild(projectID, publishID, stageID, publishJobID int64, allParms []*RunBuildAllParms, ciConfig []string, deployInfo []string) ([]*jenkins.StepItem, error) {
appImageItems := []*jenkins.StepItem{}
if len(ciConfig) != 4 {
if len(ciConfig) != 5 {
log.Log.Error("ciConfig is invalide, real len: %v", len(ciConfig))
}
......@@ -1101,7 +1101,11 @@ func (pm *PipelineManager) renderAppImageitemsForBuild(projectID, publishID, sta
if dockerfile == "" {
dockerfile = "Dockerfile"
}
Command := fmt.Sprintf("sh \"cd %v; export DOCKER_CONFIG=$DOCKER_CONFIG; /kaniko/executor -f %v -c ./ -d %v --insecure --skip-tls-verify --insecure-pull \"", appPath, dockerfile, imageURL)
var insecure = ""
if isHttps, _ := strconv.ParseBool(deployInfo[3]); !isHttps {
insecure = "--insecure --skip-tls-verify --insecure-pull"
}
Command := fmt.Sprintf("sh \"cd %v; export DOCKER_CONFIG=$DOCKER_CONFIG; /kaniko/executor -f %v -c ./ -d %v %s \"", appPath, dockerfile, imageURL, insecure)
item.Command = Command
appImageItems = append(appImageItems, item)
}
......@@ -1197,7 +1201,7 @@ func (pm *PipelineManager) GetCIConfig(stageID int64) ([]string, error) {
return []string{url, user, token, workSpace, namespace}, nil
}
// getDeployInfo cluster,harbor auth info,arrangeEnv
// getDeployInfo cluster,registry auth info,arrangeEnv
func (pm *PipelineManager) getDeployInfo(stageID int64) ([]string, int64, error) {
envStage, err := pm.modelProject.GetProjectEnvByID(stageID)
if err != nil {
......@@ -1214,24 +1218,26 @@ func (pm *PipelineManager) getDeployInfo(stageID int64) ([]string, int64, error)
return []string{}, 0, fmt.Errorf("settings type is: %s, current deploy server only support kubernetes", settingKubernetesItem.Type)
}
settingHarborItem, err := pm.settingsHandler.GetIntegrateSettingByID(envStage.Harbor)
settingRegistryItem, err := pm.settingsHandler.GetIntegrateSettingByID(envStage.Registry)
if err != nil {
log.Log.Error("integrate setting harbor by id: %v error: %s", envStage.Harbor, err.Error())
return []string{}, 0, fmt.Errorf("integrate setting harbor by id: %v error: %s", envStage.Harbor, err.Error())
log.Log.Error("integrate setting registry by id: %v error: %s", envStage.Registry, err.Error())
return []string{}, 0, fmt.Errorf("integrate setting registry by id: %v error: %s", envStage.Registry, err.Error())
}
if settingHarborItem.Type != "harbor" {
return []string{}, 0, fmt.Errorf("settings type is: %s, current deploy server only support kubernetes", settingHarborItem.Type)
if settingRegistryItem.Type != "registry" {
return []string{}, 0, fmt.Errorf("settings type is: %s, current deploy server only support kubernetes", settingRegistryItem.Type)
}
var harborAddr, harborAuth string
if harborConf, ok := settingHarborItem.Config.(*settings.HarborConfig); ok {
harborAddr = harborConf.URL
harborAuth = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%v:%v", harborConf.User, harborConf.Password)))
var registryAddr, registryAuth string
var isHttps bool
if registryConf, ok := settingRegistryItem.Config.(*settings.RegistryConfig); ok {
registryAddr = registryConf.URL
registryAuth = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%v:%v", registryConf.User, registryConf.Password)))
isHttps = registryConf.IsHttps
} else {
log.Log.Error("parse kubernetes config error")
return []string{}, 0, fmt.Errorf("parse jenkins config error")
}
return []string{settingKubernetesItem.Name, harborAddr, harborAuth}, envStage.ID, nil
return []string{settingKubernetesItem.Name, registryAddr, registryAuth, strconv.FormatBool(isHttps)}, envStage.ID, nil
}
func (pm *PipelineManager) publishStepVerify(publishID int64, step string) (bool, error) {
......
......@@ -52,7 +52,7 @@ type ProjectEnvReq struct {
Namespace string `json:"namespace"`
ArrangeEnv string `json:"arrange_env"`
CIServer int64 `json:"ci_server"`
Harbor int64 `json:"harbor"`
Registry int64 `json:"registry"`
}
func (s *PipelineReq) String() (string, error) {
......@@ -231,8 +231,8 @@ func (pm *ProjectManager) UpdateProjectEnv(request *ProjectEnvReq, stepID int64)
if request.CIServer != 0 {
stageModel.CIServer = request.CIServer
}
if request.Harbor != 0 {
stageModel.Harbor = request.Harbor
if request.Registry != 0 {
stageModel.Registry = request.Registry
}
return pm.model.UpdateProjectEnv(stageModel)
......@@ -266,7 +266,7 @@ func (pm *ProjectManager) CreateProjectEnv(request *ProjectEnvReq, creator strin
Cluster: request.Cluster,
Namespace: request.Namespace,
CIServer: request.CIServer,
Harbor: request.Harbor,
Registry: request.Registry,
ArrangeEnv: request.ArrangeEnv,
Creator: creator,
}
......
package settings
import (
"errors"
"fmt"
"net/http"
"strings"
)
func TryLoginRegistry(basicUrl, username, password string, insecure bool) error {
var schema string
if insecure {
schema = "http"
} else {
schema = "https"
}
url := fmt.Sprintf("%s://%s/v2", schema, strings.TrimRight(basicUrl, "/"))
resp, err := http.Get(url)
if err != nil || resp.StatusCode != 401 {
return errors.New("error basicUrl")
}
//get Auth Info
auth := resp.Header.Get("Www-Authenticate")
if !strings.HasPrefix(auth, "Bearer") {
return errors.New("basicUrl is incorrect")
}
//Bearer realm="https://dockerauth.cn-hangzhou.aliyuncs.com/auth",service="registry.aliyuncs.com:cn-hangzhou:26842"
kvArr := strings.Split(strings.TrimPrefix(auth, "Bearer "), ",")
var authBaseUrl, authFullUrl string
var queryParams []string
for _, i2 := range kvArr {
temp := strings.Split(i2, "=")
if strings.HasPrefix(i2, "realm") {
authBaseUrl = strings.Trim(temp[1], "\"")
} else {
queryParams = append(queryParams, temp[0]+"="+strings.Trim(temp[1], "\""))
}
}
if len(queryParams) > 0 {
authFullUrl = authBaseUrl + "?" + strings.Join(queryParams, "&")
} else {
authFullUrl = authBaseUrl
}
req, err := http.NewRequest("GET", authFullUrl, nil)
req.SetBasicAuth(username, password)
if err != nil {
return errors.New("incorrect username or password")
}
client := http.Client{}
resp, err = client.Do(req)
if err != nil {
return err
}
if resp.StatusCode != 200 {
return errors.New("incorrect username or password")
}
//body, err := ioutil.ReadAll(resp.Body)
//fmt.Println(string(body))
return nil
}
......@@ -27,7 +27,6 @@ import (
"github.com/go-atomci/atomci/dao"
"github.com/go-atomci/atomci/middleware/log"
"github.com/go-atomci/atomci/models"
"github.com/go-atomci/atomci/pkg/harbor"
"github.com/go-atomci/atomci/utils/query"
"github.com/go-atomci/atomci/utils/validate"
......@@ -68,7 +67,7 @@ type IntegrateSettingReq struct {
// const variables
const (
KubernetesType = "kubernetes"
HarborType = "harbor"
RegistryType = "registry"
JenkinsType = "jenkins"
)
......@@ -83,10 +82,11 @@ type KubeConfig struct {
URL string `json:"url,omitempty"`
Conf string `json:"conf,omitempty"`
}
type HarborConfig struct {
type RegistryConfig struct {
BaseConfig
Name string `json:"name,omitempty"`
Password string `json:"password,omitempty"`
IsHttps bool `json:"isHttps,omitempty"`
}
type JenkinsConfig struct {
......@@ -112,10 +112,10 @@ func (config *Config) Struct(sc string, settingType string) (interface{}, error)
jenkins := &JenkinsConfig{}
err := json.Unmarshal([]byte(sc), jenkins)
return jenkins, err
case "harbor":
harbor := &HarborConfig{}
err := json.Unmarshal([]byte(sc), harbor)
return harbor, err
case "registry":
registry := &RegistryConfig{}
err := json.Unmarshal([]byte(sc), registry)
return registry, err
default:
log.Log.Warn("this settings type %s is not support, return origin string", settingType)
return sc, nil
......@@ -262,18 +262,19 @@ func (pm *SettingManager) VerifyIntegrateSetting(request *IntegrateSettingReq) V
}
msg := fmt.Sprintf("Connected to Kubernetes %s", k8sVersion.GitVersion)
resp.Msg = msg
case HarborType:
harborConf := &HarborConfig{}
err := json.Unmarshal([]byte(config), harborConf)
case RegistryType:
registryConf := &RegistryConfig{}
err := json.Unmarshal([]byte(config), registryConf)
if err != nil {
log.Log.Error("harborConf conf format error: %v", err.Error())
log.Log.Error("registryConf conf format error: %v", err.Error())
resp.Error = err
} else {
log.Log.Debug("verify harbor conf: %v", harborConf)
if err := harbor.PingHarbor(harborConf.URL, harborConf.User, harborConf.Password, false); err != nil {
log.Log.Debug("verify registry conf: %v", registryConf)
if err := TryLoginRegistry(registryConf.URL, registryConf.User, registryConf.Password, !registryConf.IsHttps); err != nil {
resp.Error = err
} else {
resp.Msg = "Connected to Harbor"
resp.Msg = "Connected to Registry"
}
}
case JenkinsType:
......
# support normal docker registry
UPDATE `sys_integrate_setting` SET `type`='registry' WHERE `type`='harbor';
ALTER TABLE `project_env` CHANGE COLUMN `harbor` `registry` bigint(20) NOT NULL DEFAULT 0 AFTER `ci_server`;
\ No newline at end of file
......@@ -135,7 +135,7 @@ type ProjectEnv struct {
Namespace string `orm:"column(namespace);size(256)" json:"namespace"`
ArrangeEnv string `orm:"column(arrange_env);size(64)" json:"arrange_env"`
CIServer int64 `orm:"column(ci_server);" json:"ci_server"`
Harbor int64 `orm:"column(harbor);" json:"harbor"`
Registry int64 `orm:"column(registry);" json:"registry"`
Creator string `orm:"column(creator);size(64)" json:"creator"`
}
......
......@@ -5,7 +5,7 @@ const initializeState = {
isNeedLoading: true,
userInfo: {},
clusterList: [],
harborList: [],
registryList: [],
};
const getters = {
getLoading(state) {
......@@ -23,8 +23,8 @@ const getters = {
getClusterList(state) {
return state.clusterList;
},
getHarborList(state) {
return state.harborList;
getRegistryList(state) {
return state.registryList;
},
};
// actions
......@@ -44,8 +44,8 @@ const actions = {
setClusterList({ commit }, obj) {
commit('CHANGE_CLUSTER_LIST', { obj });
},
setHarborList({ commit }, obj) {
commit('CHANGE_HARBOR_LIST', { obj });
setRegistryList({ commit }, obj) {
commit('CHANGE_REGISTRY_LIST', { obj });
},
};
// mutations
......@@ -68,8 +68,8 @@ const mutations = {
state.curCluster = state.clusterList[0].name;
}
},
CHANGE_HARBOR_LIST(state, { obj }) {
state.harborList = obj;
CHANGE_REGISTRY_LIST(state, { obj }) {
state.registryList = obj;
},
};
export default {
......
......@@ -25,9 +25,9 @@
<el-form-item label="ENV标识" prop="arrange_env">
<el-input v-model.trim="form.arrange_env" auto-complete="off" maxlength="10" placeholder="请输入ENV标识"></el-input>
</el-form-item>
<el-form-item label="镜像仓库" prop="harbor">
<el-select v-model="form.harbor" placeholder="请选择镜像仓库" filterable>
<el-option v-for="(item, index) in harborList" :key="index" :label="item.name" :value="item.id">
<el-form-item label="镜像仓库" prop="registry">
<el-select v-model="form.registry" placeholder="请选择镜像仓库" filterable>
<el-option v-for="(item, index) in registryList" :key="index" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
......@@ -67,7 +67,7 @@ export default {
name: '',
clusterList: [],
jenkinsList: [],
harborList: [],
registryList: [],
namespaceList: [],
// 是否属于编辑状态
isEdit: false,
......@@ -87,7 +87,7 @@ export default {
arrange_env: [
{ required: true, message: '请输入ENV标识', trigger: 'blur' },
],
harbor: [
registry: [
{ required: true, message: '请输入镜像仓库', trigger: 'blur' },
],
ci_server: [
......@@ -122,8 +122,8 @@ export default {
case 'jenkins':
this.jenkinsList.push(element)
break;
case 'harbor':
this.harborList.push(element)
case 'registry':
this.registryList.push(element)
break;
default:
console.log("this type not support", element.type)
......@@ -144,7 +144,7 @@ export default {
cluster: item.cluster || undefined,
ci_server: item.ci_server || undefined,
namespace: item.namespace || 'default',
harbor: item.harbor || undefined,
registry: item.registry || undefined,
description: item.description || '',
arrange_env: item.arrange_env || '',
};
......@@ -154,18 +154,18 @@ export default {
this.rowId = item.id;
} else {
this.title = '新增';
let defaultJenkins, defaultHarbor
let defaultJenkins, defaultRegistry
if (this.jenkinsList.length > 0){
defaultJenkins = this.jenkinsList[0].id
}
if (this.harborList.length > 0){
defaultHarbor = this.harborList[0].id
if (this.registryList.length > 0){
defaultRegistry = this.registryList[0].id
}
this.form = {
name: '',
cluster: undefined,
ci_server: defaultJenkins,
harbor: defaultHarbor,
registry: defaultRegistry,
namespace: 'default',
description: '',
arrange_env: '',
......@@ -188,7 +188,7 @@ export default {
cluster: this.form.cluster,
namespace: this.form.namespace || 'default',
ci_server: this.form.ci_server,
harbor: this.form.harbor,
registry: this.form.registry,
description: this.form.description,
arrange_env: this.form.arrange_env
};
......
......@@ -27,7 +27,7 @@
<div v-if="scope.row.type === 'jenkins'">
<el-tag type="danger">{{scope.row.type}}</el-tag>
</div>
<div v-else-if="scope.row.type === 'harbor'">
<div v-else-if="scope.row.type === 'registry'">
<el-tag type="success">{{scope.row.type}}</el-tag>
</div>
<div v-else>
......
......@@ -57,17 +57,20 @@
</el-form-item>
</div >
<div v-else-if="form.type ==='harbor'">
<el-form-item label="Harbor URL" prop="config.url" class="form-item">
<el-input v-model.trim="form.config.url" auto-complete="off" placeholder="请输入 Harbor 地址"></el-input>
<div v-else-if="form.type ==='registry'">
<el-form-item label="Registry URL" prop="config.url" class="form-item">
<el-input v-model.trim="form.config.url" auto-complete="off" placeholder="请输入 Registry 地址"></el-input>
</el-form-item>
<el-form-item label="用户名" prop="config.user" class="form-item">
<el-input v-model.trim="form.config.user" auto-complete="off" maxlength="60" placeholder="请输入 Harbor 用户名"></el-input>
<el-input v-model.trim="form.config.user" auto-complete="off" maxlength="60" placeholder="请输入 Registry 用户名"></el-input>
</el-form-item>
<el-form-item label="用户密码" prop="config.password" class="form-item">
<el-input v-model.trim="form.config.password" auto-complete="off" maxlength="120" placeholder="请输入 Harbor 密码"></el-input>
<el-input v-model.trim="form.config.password" auto-complete="off" maxlength="120" placeholder="请输入 Registry 密码"></el-input>
</el-form-item>
<el-form-item label="是否HTTPS" prop="config.isHttps" class="form-item">
<el-switch v-model="form.config.isHttps"></el-switch>
</el-form-item>
</div>
<el-form-item label="描述" prop="description" class="form-item">
......@@ -107,7 +110,7 @@ export default {
settingTypeList: [
{"name": "kubernetes"},
{"name": "jenkins"},
{"name": "harbor"}
{"name": "registry"}
],
direction: 'rtl',
// 是否属于编辑状态
......@@ -161,6 +164,7 @@ export default {
.catch(_ => {});
},
doCreate(flag, item) {
console.log("test",item)
this.isEdit = flag;
this.isKubernetes = false
if (flag) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册