blob: d3d70f669a7ea64f5691754081d72804a287ffa8 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
<template>
<div class="form-layout">
<a-form
:form="form"
layout="vertical"
@submit="handleSubmit">
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.ip')">
<a-input
v-decorator="['ip', {
rules: [{ required: true, message: $t('message.error.required.input') }]
}]" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.username')">
<a-input
v-decorator="['username', {
rules: [{ required: true, message: $t('message.error.required.input') }]
}]" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.password')">
<a-input-password
v-decorator="['password', {
rules: [{ required: true, message: $t('message.error.required.input') }]
}]" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.numretries')">
<a-input-number
style="width: 100%"
v-decorator="['numretries', { initialValue: 2 }]" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.transportzoneuuid')">
<a-input
v-decorator="['transportzoneuuid']" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.l3gatewayserviceuuid')">
<a-input
v-decorator="['l3gatewayserviceuuid']" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :md="24" :lg="24">
<a-form-item :label="$t('label.l2gatewayserviceuuid')">
<a-input
v-decorator="['l2gatewayserviceuuid']" />
</a-form-item>
</a-col>
</a-row>
<div :span="24" class="action-button">
<a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
<a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
</div>
</a-form>
</div>
</template>
<script>
import { api } from '@/api'
export default {
name: 'AddNiciraNvpDevice',
props: {
resource: {
type: Object,
default: () => {}
},
action: {
type: Object,
default: () => {}
}
},
data () {
return {
loading: false,
nsp: {}
}
},
beforeCreate () {
this.form = this.$form.createForm(this)
},
mounted () {
if (this.resource && Object.keys(this.resource).length > 0) {
this.nsp = this.resource
}
},
inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
methods: {
onCloseAction () {
this.provideCloseAction()
},
handleSubmit (e) {
e.preventDefault()
this.form.validateFields(async (err, values) => {
if (err) {
return
}
const params = {}
params.physicalnetworkid = this.resource.physicalnetworkid
params.hostname = values.ip
params.username = values.username
params.password = values.password
params.transportzoneuuid = values.transportzoneuuid ? values.transportzoneuuid : null
params.l2gatewayserviceuuid = values.l2gatewayserviceuuid ? values.l2gatewayserviceuuid : null
params.l3gatewayserviceuuid = values.l3gatewayserviceuuid ? values.l3gatewayserviceuuid : null
this.loading = true
try {
if (!this.nsp.id) {
const addParams = {}
addParams.name = this.resource.name
addParams.physicalnetworkid = this.resource.physicalnetworkid
const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
this.nsp = { ...this.resource, ...networkServiceProvider }
}
params.id = this.nsp.id
const jobId = await this.addNiciraNvpDevice(params)
if (jobId) {
await this.$store.dispatch('AddAsyncJob', {
title: this.$t(this.action.label),
jobid: jobId,
description: this.$t(this.nsp.name),
status: 'progress'
})
await this.parentPollActionCompletion(jobId, this.action)
}
this.loading = false
await this.provideCloseAction()
} catch (error) {
this.loading = false
this.$notification.error({
message: this.$t('message.request.failed'),
description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
})
}
})
},
addNetworkServiceProvider (args) {
return new Promise((resolve, reject) => {
api('addNetworkServiceProvider', args).then(async json => {
const jobId = json.addnetworkserviceproviderresponse.jobid
if (jobId) {
const result = await this.pollJob(jobId)
if (result.jobstatus === 2) {
reject(result.jobresult.errortext)
return
}
resolve(result.jobresult.networkserviceprovider)
}
}).catch(error => {
reject(error)
})
})
},
addNiciraNvpDevice (args) {
return new Promise((resolve, reject) => {
api('addNiciraNvpDevice', args).then(json => {
const jobId = json.addniciranvpdeviceresponse.jobid || null
resolve(jobId)
}).catch(error => {
reject(error)
})
})
},
async pollJob (jobId) {
return new Promise(resolve => {
const asyncJobInterval = setInterval(() => {
api('queryAsyncJobResult', { jobId }).then(async json => {
const result = json.queryasyncjobresultresponse
if (result.jobstatus === 0) {
return
}
clearInterval(asyncJobInterval)
resolve(result)
})
}, 1000)
})
}
}
}
</script>
<style scoped lang="less">
.form-layout {
.action-button {
text-align: right;
margin-top: 20px;
button {
margin-right: 5px;
}
}
}
</style>