Просмотр исходного кода

Merge pull request #505 from smiclea/ovm-migr-template

Implement migr. template map for OVM plugin
Nashwan Azhari 6 лет назад
Родитель
Сommit
0bde269c4e

+ 4 - 1
src/components/organisms/EditReplica/EditReplica.jsx

@@ -22,6 +22,7 @@ import providerStore, { getFieldChangeOptions } from '../../../stores/ProviderSt
 import replicaStore from '../../../stores/ReplicaStore'
 import migrationStore from '../../../stores/MigrationStore'
 import endpointStore from '../../../stores/EndpointStore'
+import { OptionsSchemaPlugin } from '../../../plugins/endpoint'
 
 import Button from '../../atoms/Button'
 import StatusImage from '../../atoms/StatusImage'
@@ -367,7 +368,9 @@ class EditReplica extends React.Component<Props, State> {
     }
     let osMapping = /^(windows|linux)_os_image$/.exec(fieldName)
     if (osMapping) {
-      let osData = replicaData[`migr_image_map/${osMapping[1]}`]
+      let endpoint = type === 'source' ? this.props.sourceEndpoint : this.props.destinationEndpoint
+      let plugin = OptionsSchemaPlugin[endpoint.type] || OptionsSchemaPlugin.default
+      let osData = replicaData[`${plugin.migrationImageMapFieldName}/${osMapping[1]}`]
       return osData
     }
     if (migrationFields.find(f => f.name === fieldName) && this.props.replica[fieldName]) {

+ 8 - 2
src/components/organisms/MainDetails/MainDetails.jsx

@@ -38,6 +38,7 @@ import StyleProps from '../../styleUtils/StyleProps'
 import Palette from '../../styleUtils/Palette'
 import DateUtils from '../../../utils/DateUtils'
 import LabelDictionary from '../../../utils/LabelDictionary'
+import { OptionsSchemaPlugin } from '../../../plugins/endpoint'
 
 import arrowImage from './images/arrow.svg'
 
@@ -204,14 +205,19 @@ class MainDetails extends React.Component<Props> {
   }
 
   renderPropertiesTable(propertyNames: string[]) {
+    let endpoint = this.getDestinationEndpoint()
+
     let getValue = (name: string, value: any) => {
       if (value.join && value.length && value[0].destination && value[0].source) {
         return value.map(v => `${v.source}=${v.destination}`).join(', ')
       }
-      return fieldHelper.getValueAlias(name, value, this.props.destinationSchema)
+      return fieldHelper.getValueAlias(name, value, this.props.destinationSchema, endpoint && endpoint.type)
     }
 
     let properties = []
+    let plugin = endpoint && (OptionsSchemaPlugin[endpoint.type] || OptionsSchemaPlugin.default)
+    let migrationImageMapFieldName = plugin && plugin.migrationImageMapFieldName
+
     propertyNames.forEach(pn => {
       let value = this.props.item ? this.props.item.destination_environment[pn] : ''
       let label = LabelDictionary.get(pn)
@@ -228,7 +234,7 @@ class MainDetails extends React.Component<Props> {
             return null
           }
           let fieldName = pn
-          if (fieldName === 'migr_image_map') {
+          if (migrationImageMapFieldName && fieldName === migrationImageMapFieldName) {
             fieldName = `${p}_os_image`
           }
           return {

+ 5 - 2
src/components/organisms/WizardSummary/WizardSummary.jsx

@@ -255,6 +255,8 @@ class WizardSummary extends React.Component<Props> {
   renderSourceOptionsSection() {
     let data = this.props.data
     let type = this.props.wizardType.charAt(0).toUpperCase() + this.props.wizardType.substr(1)
+    let provider = this.props.data && this.props.data.source && this.props.data.source.type
+
     if (!data.sourceOptions) {
       return null
     }
@@ -268,7 +270,7 @@ class WizardSummary extends React.Component<Props> {
               return null
             }
             let optionLabel = optionName.split('/').map(n => LabelDictionary.get(n)).join(' - ')
-            let optionValue = fieldHelper.getValueAlias(optionName, data.sourceOptions && data.sourceOptions[optionName], this.props.sourceSchema)
+            let optionValue = fieldHelper.getValueAlias(optionName, data.sourceOptions && data.sourceOptions[optionName], this.props.sourceSchema, provider)
             return (
               <Option key={optionName}>
                 <OptionLabel title={optionLabel}>
@@ -287,6 +289,7 @@ class WizardSummary extends React.Component<Props> {
 
   renderTargetOptionsSection() {
     let data = this.props.data
+    let provider = this.props.data && this.props.data.target && this.props.data.target.type
     let type = this.props.wizardType.charAt(0).toUpperCase() + this.props.wizardType.substr(1)
 
     let executeNowOption = (
@@ -344,7 +347,7 @@ class WizardSummary extends React.Component<Props> {
             }
 
             let optionLabel = optionName.split('/').map(n => LabelDictionary.get(n)).join(' - ')
-            let optionValue = fieldHelper.getValueAlias(optionName, data.destOptions && data.destOptions[optionName], this.props.destinationSchema)
+            let optionValue = fieldHelper.getValueAlias(optionName, data.destOptions && data.destOptions[optionName], this.props.destinationSchema, provider)
             return (
               <Option key={optionName}>
                 <OptionLabel data-test-id={`wSummary-optionLabel-${optionName}`} title={optionLabel}>

+ 10 - 8
src/plugins/endpoint/default/OptionsSchemaPlugin.js

@@ -42,8 +42,8 @@ export const defaultFillFieldValues = (field: Field, option: OptionValues) => {
   }
 }
 
-export const defaultFillMigrationImageMapValues = (field: Field, option: OptionValues): boolean => {
-  if (field.name !== 'migr_image_map') {
+export const defaultFillMigrationImageMapValues = (field: Field, option: OptionValues, migrationImageMapFieldName: string): boolean => {
+  if (field.name !== migrationImageMapFieldName) {
     return false
   }
   field.properties = migrationImageOsTypes.map(os => {
@@ -100,7 +100,7 @@ export const defaultGetDestinationEnv = (options: ?{ [string]: mixed }, oldOptio
   return env
 }
 
-export const defaultGetMigrationImageMap = (options: ?{ [string]: mixed }) => {
+export const defaultGetMigrationImageMap = (options: ?{ [string]: mixed }, migrationImageMapFieldName: string) => {
   let env = {}
   if (!options) {
     return env
@@ -109,17 +109,19 @@ export const defaultGetMigrationImageMap = (options: ?{ [string]: mixed }) => {
     if (!options || !options[`${os}_os_image`]) {
       return
     }
-    if (!env.migr_image_map) {
-      env.migr_image_map = {}
+    if (!env[migrationImageMapFieldName]) {
+      env[migrationImageMapFieldName] = {}
     }
 
-    env.migr_image_map[os] = options[`${os}_os_image`]
+    env[migrationImageMapFieldName][os] = options[`${os}_os_image`]
   })
 
   return env
 }
 
 export default class OptionsSchemaParser {
+  static migrationImageMapFieldName = 'migr_image_map'
+
   static parseSchemaToFields(schema: SchemaProperties, schemaDefinitions?: ?SchemaDefinitions) {
     return defaultSchemaToFields(schema, schemaDefinitions)
   }
@@ -129,7 +131,7 @@ export default class OptionsSchemaParser {
     if (!option) {
       return
     }
-    if (!defaultFillMigrationImageMapValues(field, option)) {
+    if (!defaultFillMigrationImageMapValues(field, option, this.migrationImageMapFieldName)) {
       defaultFillFieldValues(field, option)
     }
   }
@@ -137,7 +139,7 @@ export default class OptionsSchemaParser {
   static getDestinationEnv(options: ?{ [string]: mixed }, oldOptions?: any) {
     let env = {
       ...defaultGetDestinationEnv(options, oldOptions),
-      ...defaultGetMigrationImageMap(options),
+      ...defaultGetMigrationImageMap(options, this.migrationImageMapFieldName),
     }
     return env
   }

+ 7 - 0
src/plugins/endpoint/openstack/OptionsSchemaPlugin.js

@@ -17,12 +17,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 import DefaultOptionsSchemaPlugin from '../default/OptionsSchemaPlugin'
 import LabelDictionary from '../../../utils/LabelDictionary'
 
+import type { InstanceScript } from '../../../types/Instance'
 import type { Field } from '../../../types/Field'
 import type { OptionValues, StorageMap } from '../../../types/Endpoint'
 import type { SchemaProperties, SchemaDefinitions } from '../../../types/Schema'
 import type { NetworkMap } from '../../../types/Network'
 
 export default class OptionsSchemaParser {
+  static migrationImageMapFieldName = DefaultOptionsSchemaPlugin.migrationImageMapFieldName
+
   static parseSchemaToFields(schema: SchemaProperties, schemaDefinitions?: ?SchemaDefinitions) {
     let fields = DefaultOptionsSchemaPlugin.parseSchemaToFields(schema, schemaDefinitions)
     let exportMechField = fields.find(f => f.name === 'replica_export_mechanism')
@@ -68,5 +71,9 @@ export default class OptionsSchemaParser {
   static getStorageMap(defaultStorage: ?string, storageMap: ?StorageMap[], configDefault?: ?string) {
     return DefaultOptionsSchemaPlugin.getStorageMap(defaultStorage, storageMap, configDefault)
   }
+
+  static getUserScripts(uploadedUserScripts: InstanceScript[]) {
+    return DefaultOptionsSchemaPlugin.getUserScripts(uploadedUserScripts)
+  }
 }
 

+ 25 - 3
src/plugins/endpoint/ovm/OptionsSchemaPlugin.js

@@ -14,14 +14,22 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // @flow
 
-import DefaultOptionsSchemaPlugin from '../default/OptionsSchemaPlugin'
+import DefaultOptionsSchemaPlugin, {
+  defaultFillMigrationImageMapValues,
+  defaultFillFieldValues,
+  defaultGetDestinationEnv,
+  defaultGetMigrationImageMap,
+} from '../default/OptionsSchemaPlugin'
 
+import type { InstanceScript } from '../../../types/Instance'
 import type { Field } from '../../../types/Field'
 import type { OptionValues, StorageMap } from '../../../types/Endpoint'
 import type { SchemaProperties, SchemaDefinitions } from '../../../types/Schema'
 import type { NetworkMap } from '../../../types/Network'
 
 export default class OptionsSchemaParser {
+  static migrationImageMapFieldName = 'migr_template_map'
+
   static parseSchemaToFields(schema: SchemaProperties, schemaDefinitions?: ?SchemaDefinitions) {
     let fields = DefaultOptionsSchemaPlugin.parseSchemaToFields(schema, schemaDefinitions)
     fields.forEach(f => {
@@ -50,11 +58,21 @@ export default class OptionsSchemaParser {
   }
 
   static fillFieldValues(field: Field, options: OptionValues[]) {
-    DefaultOptionsSchemaPlugin.fillFieldValues(field, options)
+    let option = options.find(f => f.name === field.name)
+    if (!option) {
+      return
+    }
+    if (!defaultFillMigrationImageMapValues(field, option, this.migrationImageMapFieldName)) {
+      defaultFillFieldValues(field, option)
+    }
   }
 
   static getDestinationEnv(options: ?{ [string]: mixed }, oldOptions?: any) {
-    return DefaultOptionsSchemaPlugin.getDestinationEnv(options, oldOptions)
+    let env = {
+      ...defaultGetDestinationEnv(options, oldOptions),
+      ...defaultGetMigrationImageMap(options, this.migrationImageMapFieldName),
+    }
+    return env
   }
 
   static getNetworkMap(networkMappings: ?NetworkMap[]) {
@@ -64,5 +82,9 @@ export default class OptionsSchemaParser {
   static getStorageMap(defaultStorage: ?string, storageMap: ?StorageMap[], configDefault?: ?string) {
     return DefaultOptionsSchemaPlugin.getStorageMap(defaultStorage, storageMap, configDefault)
   }
+
+  static getUserScripts(uploadedUserScripts: InstanceScript[]) {
+    return DefaultOptionsSchemaPlugin.getUserScripts(uploadedUserScripts)
+  }
 }
 

+ 6 - 2
src/types/Field.js

@@ -14,6 +14,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // @flow
 
+import { OptionsSchemaPlugin } from '../plugins/endpoint'
+
 export type Field = {
   name: string,
   type?: string,
@@ -42,7 +44,9 @@ export type Field = {
 const migrationImageOsTypes = ['windows', 'linux']
 
 class FieldHelper {
-  getValueAlias(name: string, value: any, fields: Field[]): string {
+  getValueAlias(name: string, value: any, fields: Field[], targetProvider: ?string): string {
+    let plugin = targetProvider && (OptionsSchemaPlugin[targetProvider] || OptionsSchemaPlugin.default)
+
     if (value === true) {
       return 'Yes'
     }
@@ -85,7 +89,7 @@ class FieldHelper {
 
     let isImageMapField = migrationImageOsTypes.find(os => `${os}_os_image` === name)
     if (isImageMapField) {
-      let migrImageField = fields.find(f => f.name === 'migr_image_map')
+      let migrImageField = plugin && fields.find(f => f.name === plugin.migrationImageMapFieldName)
       if (migrImageField && migrImageField.properties) {
         let imageField = migrImageField.properties.find(p => p.name === name)
         if (imageField && imageField.enum) {