diff --git a/etc/murano-repository.conf.sample b/etc/murano-repository.conf.sample
index c5e4755..b274486 100644
--- a/etc/murano-repository.conf.sample
+++ b/etc/murano-repository.conf.sample
@@ -30,8 +30,9 @@ heat = heat_templates
agent = agent_templates
scripts = scripts
-# Configure archive structure
-# data_type = desired folder
+# Configure client archive structure
+# Format: data_type = desired folder
+# ui parameter is not actually used, but is kept to not break things apart
[output]
ui = service_forms
workflows = workflows
diff --git a/muranorepository/Services/ui_forms/ActiveDirectory.yaml b/muranorepository/Services/ui_forms/ActiveDirectory.yaml
index f329bc7..fa2b1cf 100644
--- a/muranorepository/Services/ui_forms/ActiveDirectory.yaml
+++ b/muranorepository/Services/ui_forms/ActiveDirectory.yaml
@@ -1,11 +1,3 @@
-name: Active Directory
-type: activeDirectory
-
-description: >-
- The Active Directory Service
- includes one primary and optionally a few secondary
- Domain Controllers, with DNS
-
unitTemplates:
- isMaster: true
recoveryPassword: {YAQL: $.serviceConfiguration.recoveryPassword}
diff --git a/muranorepository/Services/ui_forms/AspNetApp.yaml b/muranorepository/Services/ui_forms/AspNetApp.yaml
index 2e38472..04edc9f 100644
--- a/muranorepository/Services/ui_forms/AspNetApp.yaml
+++ b/muranorepository/Services/ui_forms/AspNetApp.yaml
@@ -1,10 +1,3 @@
-name: ASP.NET Application
-type: aspNetApp
-
-description: >-
- The ASP.NET Application Service installs
- custom application onto one IIS Web Server
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/AspNetAppFarm.yaml b/muranorepository/Services/ui_forms/AspNetAppFarm.yaml
index 151d8a5..31b4e56 100644
--- a/muranorepository/Services/ui_forms/AspNetAppFarm.yaml
+++ b/muranorepository/Services/ui_forms/AspNetAppFarm.yaml
@@ -1,10 +1,3 @@
-name: ASP.NET Application Web Farm
-type: aspNetAppFarm
-
-description: >-
- The ASP.NET Farm Service installs a custom application
- on a load-balanced array of IIS servers
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/Demo.yaml b/muranorepository/Services/ui_forms/Demo.yaml
index be0e863..15113fe 100644
--- a/muranorepository/Services/ui_forms/Demo.yaml
+++ b/muranorepository/Services/ui_forms/Demo.yaml
@@ -1,10 +1,3 @@
-name: Demo Service
-type: demoService
-
-description: >-
- Demo Service
- shows how Murano is working.
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/LinuxApache.yaml b/muranorepository/Services/ui_forms/LinuxApache.yaml
index a050b7a..6ea05e8 100644
--- a/muranorepository/Services/ui_forms/LinuxApache.yaml
+++ b/muranorepository/Services/ui_forms/LinuxApache.yaml
@@ -1,10 +1,3 @@
-name: Linux Apache
-type: linuxApacheService
-
-description: >-
- Linux Apache Service
- Demonstrates a linux agent, which installs Apache web server.
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/LinuxTelnet.yaml b/muranorepository/Services/ui_forms/LinuxTelnet.yaml
index a37ea0d..d08025b 100644
--- a/muranorepository/Services/ui_forms/LinuxTelnet.yaml
+++ b/muranorepository/Services/ui_forms/LinuxTelnet.yaml
@@ -1,10 +1,3 @@
-name: Linux Telnet
-type: linuxTelnetService
-
-description: >-
- Linux Telnet Service
- Demonstrates a simple linux agent, which installs Telnet if required.
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/MsSqlClusterServer.yaml b/muranorepository/Services/ui_forms/MsSqlClusterServer.yaml
index 646e0a7..96562ff 100644
--- a/muranorepository/Services/ui_forms/MsSqlClusterServer.yaml
+++ b/muranorepository/Services/ui_forms/MsSqlClusterServer.yaml
@@ -1,10 +1,3 @@
-name: MS SQL Server Cluster
-type: msSqlClusterServer
-
-description: >-
- The MS SQL Failover Cluster installs
- Microsoft SQL Failover Cluster Server
-
unitTemplates:
- isMaster: true
isSync: true
diff --git a/muranorepository/Services/ui_forms/MsSqlServer.yaml b/muranorepository/Services/ui_forms/MsSqlServer.yaml
index 1b8428d..228ead7 100644
--- a/muranorepository/Services/ui_forms/MsSqlServer.yaml
+++ b/muranorepository/Services/ui_forms/MsSqlServer.yaml
@@ -1,10 +1,3 @@
-name: MS SQL Server
-type: msSqlServer
-
-description: >-
- The MS SQL Service installs an instance of
- Microsoft SQL Server
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/WebServer.yaml b/muranorepository/Services/ui_forms/WebServer.yaml
index 7503701..a181615 100644
--- a/muranorepository/Services/ui_forms/WebServer.yaml
+++ b/muranorepository/Services/ui_forms/WebServer.yaml
@@ -1,10 +1,3 @@
-name: Internet Information Services
-type: webServer
-
-description: >-
- The Internet Information Service
- sets up an IIS server and joins it into an existing domain
-
unitTemplates:
- {}
diff --git a/muranorepository/Services/ui_forms/WebServerFarm.yaml b/muranorepository/Services/ui_forms/WebServerFarm.yaml
index 3bf2f6d..9725584 100644
--- a/muranorepository/Services/ui_forms/WebServerFarm.yaml
+++ b/muranorepository/Services/ui_forms/WebServerFarm.yaml
@@ -1,9 +1,3 @@
-name: Internet Information Services Web Farm
-type: webServerFarm
-
-description: >-
- The IIS Farm Service sets up a load-balanced set of IIS servers
-
unitTemplates:
- {}
diff --git a/muranorepository/consts.py b/muranorepository/consts.py
index c8fc526..ef366d0 100644
--- a/muranorepository/consts.py
+++ b/muranorepository/consts.py
@@ -26,3 +26,7 @@ CLIENTS_DICT = {'conductor': (WORKFLOW, HEAT, AGENT, SCRIPTS),
'ui': (UI,)}
ARCHIVE_PKG_NAME = 'data.tar.gz'
+
+UI_FIELDS_IN_MANIFEST = {'description': 'description',
+ 'type': 'full_service_name',
+ 'name': 'service_display_name'}
diff --git a/muranorepository/utils/archiver.py b/muranorepository/utils/archiver.py
index 22e77dc..1f42f74 100644
--- a/muranorepository/utils/archiver.py
+++ b/muranorepository/utils/archiver.py
@@ -17,9 +17,12 @@ import tarfile
import tempfile
import shutil
import hashlib
+import yaml
import logging as log
from oslo.config import cfg
+from .parser import serialize
from muranorepository.consts import DATA_TYPES, ARCHIVE_PKG_NAME
+from muranorepository.consts import UI, UI_FIELDS_IN_MANIFEST
CONF = cfg.CONF
CHUNK_SIZE = 1 << 20 # 1MB
@@ -138,6 +141,24 @@ class Archiver(object):
os.mkdir(pkg_dir)
return pkg_dir
+ def _compose_ui_forms(self, manifest, ui_definitions, src, dst):
+ """
+ Extends ui_forms before sending to client.
+ Some parameters defined UI_FIELDS_IN_MANIFEST that are required
+ for ui forms are specified in manifest.
+ """
+ new_dst = os.path.join(os.path.dirname(dst),
+ manifest.full_service_name)
+ if not os.path.exists(new_dst):
+ os.makedirs(new_dst)
+ for file in ui_definitions:
+ with open(os.path.join(src, file)) as ui_form:
+ content = yaml.load(ui_form)
+ for ui_name, manifest_name in UI_FIELDS_IN_MANIFEST.iteritems():
+ content[ui_name] = getattr(manifest, manifest_name)
+ with open(os.path.join(new_dst, file), 'w') as ui_form:
+ ui_form.write(serialize(content))
+
def get_existing_hash(self, cache_dir):
existing_caches = os.listdir(cache_dir)
if not len(existing_caches):
@@ -190,7 +211,13 @@ class Archiver(object):
CONF.manifests, self.src_directories[data_type])
dst_directory = os.path.join(
temp_dir, self.dst_directories[data_type])
- self._copy_data(file_list, scr_directory, dst_directory)
+ if data_type == UI:
+ self._compose_ui_forms(manifest, file_list,
+ scr_directory, dst_directory)
+ else:
+ self._copy_data(file_list,
+ scr_directory,
+ dst_directory)
else:
log.info(
'Manifest for {0} service has no file definitions for '