Skip to content

Commit 5a7acc8

Browse files
authored
Merge pull request #314 from WeBankPartners/dev
Dev
2 parents fe9e978 + 011e5a0 commit 5a7acc8

32 files changed

+20867
-3410
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ ADD artifacts-corepy/requirements.txt /tmp/requirements.txt
77
ADD artifacts-corepy/dist/* /tmp/
88
RUN mkdir -p /etc/artifacts_corepy/
99
RUN mkdir -p /var/log/artifacts_corepy/
10+
RUN mkdir -p /tmp/artifacts/
1011
ADD artifacts-corepy/etc/* /etc/artifacts_corepy/
1112
ADD nexus-data.tar.gz /nexus-data-init
1213

Dockerfile_nonexus

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
FROM python:3.7-slim
1+
FROM python:3.8-slim-buster
22
LABEL maintainer = "Webank CTB Team"
33
RUN sed -i 's/deb.debian.org/mirrors.tencentyun.com/g' /etc/apt/sources.list
44
RUN sed -i 's/security.debian.org/mirrors.tencentyun.com/g' /etc/apt/sources.list
55
ADD artifacts-corepy/requirements.txt /tmp/requirements.txt
66
ADD artifacts-corepy/dist/* /tmp/
77
RUN mkdir -p /etc/artifacts_corepy/
88
RUN mkdir -p /var/log/artifacts_corepy/
9+
RUN mkdir -p /tmp/artifacts/
910
ADD artifacts-corepy/etc/* /etc/artifacts_corepy/
1011
# Install && Clean up
1112
RUN apt update && apt-get -y install gcc swig libssl-dev python3-dev && \

Makefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ clean_py:
1111
build_py: clean_py
1212
pip3 install wheel
1313
cd artifacts-corepy && python3 setup.py bdist_wheel
14-
cd artifacts-ui && npm rebuild node-sass
15-
cd artifacts-ui && npm install --save core-js@2
1614
cd artifacts-ui && npm run plugin
1715

1816
image_py: build_py

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,16 @@
1-
# wecube-plugins-artifacts
1+
# wecube-plugins-artifacts
2+
3+
4+
接口说明:
5+
组合物料包:包含原始物料包,包的配置,差异化变量配置信息,便于跨环境的物料使用
6+
7+
1. 导出组合物料包:
8+
即下载组合物料包到本地文件系统
9+
GET /artifacts/packages/{deploy_package_id}/download
10+
响应:文件流下载
11+
2. 推送组合物料包:
12+
推送组合物料包到指定nexus上,nexus通过系统参数PUSH_NEXUS_\*配置
13+
POST /artifacts/unit-designs/{unit_design_id}/packages/{deploy_package_id}/push
14+
请求:json {}
15+
响应:新包配置数据
16+

artifacts-corepy/artifacts_corepy/apps/package/api.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,9 +1239,15 @@ def update_file_variable(self, package_cached_dir, files):
12391239
'''
12401240
解析文件差异化变量
12411241
'''
1242-
spliters = [s.strip() for s in CONF.encrypt_variable_prefix.split(',')]
1243-
spliters.extend([s.strip() for s in CONF.file_variable_prefix.split(',')])
1244-
spliters.extend([s.strip() for s in CONF.default_special_replace.split(',')])
1242+
spliters = []
1243+
if CONF.encrypt_variable_prefix.strip():
1244+
spliters = [s.strip() for s in CONF.encrypt_variable_prefix.split(',')]
1245+
if CONF.file_variable_prefix.strip():
1246+
spliters.extend([s.strip() for s in CONF.file_variable_prefix.split(',')])
1247+
if CONF.default_special_replace.strip():
1248+
spliters.extend([s.strip() for s in CONF.default_special_replace.split(',')])
1249+
if CONF.global_variable_prefix.strip():
1250+
spliters.extend([s.strip() for s in CONF.global_variable_prefix.split(',')])
12451251
spliters = [s for s in spliters if s]
12461252
for i in files:
12471253
filepath = os.path.join(package_cached_dir, i['filename'])

artifacts-corepy/artifacts_corepy/apps/package/apiv2.py

Lines changed: 1158 additions & 696 deletions
Large diffs are not rendered by default.

artifacts-corepy/artifacts_corepy/apps/package/controller.py

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
import cgi
66
import falcon
77
import os
8+
import json
89
import urllib.parse
10+
from talos.core import utils
911
from talos.core import config
1012
from talos.core.i18n import _
1113
from talos.common import controller as base_controller
1214

1315
from artifacts_corepy.common.controller import Collection, Item, POSTCollection
1416
from artifacts_corepy.common import exceptions
1517
from artifacts_corepy.apps.package import apiv2 as package_api
18+
from artifacts_corepy.common import constant
1619

1720
CONF = config.CONF
1821

@@ -45,6 +48,22 @@ def on_get(self, req, resp, **kwargs):
4548
'message': 'success'
4649
}
4750

51+
52+
class CollectionProcessDef(Collection):
53+
allow_methods = ('GET', )
54+
name = 'artifacts.process.defs'
55+
resource = package_api.ProcessDef
56+
57+
class CollectionUser(Collection):
58+
allow_methods = ('GET', )
59+
name = 'artifacts.users.list'
60+
resource = package_api.User
61+
62+
class CollectionCiData(POSTCollection):
63+
allow_methods = ('POST',)
64+
name = 'artifacts.diffconfigs'
65+
resource = package_api.CiData
66+
4867
class CollectionSystemDesign(Collection):
4968
allow_methods = ('GET', )
5069
name = 'artifacts.system-designs'
@@ -87,10 +106,23 @@ class CollectionUnitDesignPackages(POSTCollection):
87106
resource = package_api.UnitDesignPackages
88107

89108

109+
class CollectionPackageStatistics(POSTCollection):
110+
allow_methods = ('POST', )
111+
name = 'artifacts.packages.statistics'
112+
resource = package_api.UnitDesignPackages
113+
114+
def list(self, req, criteria, **kwargs):
115+
return self.make_resource(req).get_package_statistics(req.json, **kwargs)
116+
90117
class CollectionUnitDesignNexusPackages(POSTCollection):
91118
allow_methods = ('POST', )
92119
name = 'artifacts.unit-design.nexus.packages'
93120
resource = package_api.UnitDesignNexusPackages
121+
122+
class ItemUnitDesignNexusPackages(Item):
123+
allow_methods = ('GET', )
124+
name = 'artifacts.unit-design.nexus.path'
125+
resource = package_api.UnitDesignNexusPackages
94126

95127

96128
class CollectionUnitDesignNexusPackageUpload(object):
@@ -99,18 +131,24 @@ class CollectionUnitDesignNexusPackageUpload(object):
99131

100132
def on_post(self, req, resp, **kwargs):
101133
download_url = req.params.get('downloadUrl', None)
134+
baseline_package = req.params.get('baseline_package', None)
135+
package_type = req.params.get('package_type', None)
136+
if not package_type:
137+
raise exceptions.ValidationError(message=_('missing query param: package_type'))
138+
elif package_type not in [constant.PackageType.app, constant.PackageType.db, constant.PackageType.mixed, constant.PackageType.image, constant.PackageType.rule]:
139+
raise exceptions.ValidationError(message=_('invalid package_type param value: %s') % package_type)
102140
if not download_url:
103-
raise exceptions.ValidationError(message=_('missing query: downloadUrl'))
104-
form = cgi.FieldStorage(fp=req.stream, environ=req.env)
141+
raise exceptions.ValidationError(message=_('missing query param: downloadUrl'))
142+
# form = cgi.FieldStorage(fp=req.stream, environ=req.env)
105143
resp.json = {
106144
'code': 200,
107145
'status': 'OK',
108-
'data': self.upload(req, download_url, **kwargs),
146+
'data': self.upload(req, download_url, baseline_package, package_type, **kwargs),
109147
'message': 'success'
110148
}
111149

112-
def upload(self, req, download_url, **kwargs):
113-
return self.resource().upload_from_nexus(download_url, **kwargs)
150+
def upload(self, req, download_url, baseline_package, package_type, **kwargs):
151+
return self.resource().upload_from_nexus(download_url, baseline_package, package_type, **kwargs)
114152

115153

116154
class CollectionUnitDesignPackageUpload(object):
@@ -119,15 +157,25 @@ class CollectionUnitDesignPackageUpload(object):
119157

120158
def on_post(self, req, resp, **kwargs):
121159
form = cgi.FieldStorage(fp=req.stream, environ=req.env)
160+
baseline_package = None
161+
package_type = None
162+
if 'baseline_package' in form:
163+
baseline_package = form.getvalue('baseline_package', None)
164+
if 'package_type' in form:
165+
package_type = form.getvalue('package_type', None)
166+
if not package_type:
167+
raise exceptions.ValidationError(message=_('missing form param: package_type'))
168+
elif package_type not in [constant.PackageType.app, constant.PackageType.db, constant.PackageType.mixed, constant.PackageType.image, constant.PackageType.rule]:
169+
raise exceptions.ValidationError(message=_('invalid package_type param value: %s') % package_type)
122170
resp.json = {
123171
'code': 200,
124172
'status': 'OK',
125-
'data': self.upload(req, form['file'].filename, form['file'].type, form['file'].file, **kwargs),
173+
'data': self.upload(req, form['file'].filename, form['file'].type, form['file'].file, baseline_package, package_type, **kwargs),
126174
'message': 'success'
127175
}
128176

129-
def upload(self, req, filename, filetype, fileobj, **kwargs):
130-
return self.resource().upload(filename, filetype, fileobj, **kwargs)
177+
def upload(self, req, filename, filetype, fileobj, baseline_package, package_type, **kwargs):
178+
return self.resource().upload(filename, filetype, fileobj, baseline_package, package_type, **kwargs)
131179

132180

133181
class ItemPackage(Item):
@@ -305,10 +353,43 @@ class PushComposePackage(base_controller.Controller):
305353
resource = package_api.UnitDesignPackages
306354

307355
def on_post(self, req, resp, **kwargs):
356+
body_param = {}
357+
if hasattr(req, 'json'):
358+
body_param = req.json
308359
resp.json = {
309360
'code': 200,
310361
'status': 'OK',
311-
'data': self.resource().push_compose_package(**kwargs),
362+
'data': self.resource().push_compose_package(body_param, **kwargs),
363+
'message': 'success'
364+
}
365+
resp.status = falcon.HTTP_200
366+
367+
class SystemConfig(base_controller.Controller):
368+
allow_methods = ('GET',)
369+
name = 'artifacts.systemconfig'
370+
resource = package_api.UnitDesignPackages
371+
372+
def on_get(self, req, resp, **kwargs):
373+
local_nexus_server = CONF.nexus.server
374+
remote_nexus_server = CONF.wecube.nexus.server
375+
push_nexus_server = CONF.pushnexus.server
376+
local_nexus_server = local_nexus_server.strip()
377+
remote_nexus_server = remote_nexus_server.strip()
378+
push_nexus_server = push_nexus_server.strip()
379+
if utils.bool_from_string(CONF.use_remote_nexus_only):
380+
local_nexus_server = remote_nexus_server
381+
resp.json = {
382+
'code': 200,
383+
'status': 'OK',
384+
'data': {
385+
'upload_enabled': bool(utils.bool_from_string(CONF.wecube.upload_enabled) and local_nexus_server),
386+
'upload_from_nexus_enabled': bool(utils.bool_from_string(CONF.wecube.upload_nexus_enabled) and remote_nexus_server),
387+
'push_to_nexus_enabled': True if push_nexus_server else False,
388+
'variable_prefix_encrypt': [] if not CONF.encrypt_variable_prefix.strip() else [s.strip() for s in CONF.encrypt_variable_prefix.split(',')],
389+
'variable_prefix_file': [] if not CONF.file_variable_prefix.strip() else [s.strip() for s in CONF.file_variable_prefix.split(',')],
390+
'variable_prefix_default': [] if not CONF.default_special_replace.strip() else [s.strip() for s in CONF.default_special_replace.split(',')],
391+
'variable_prefix_global': [] if not CONF.global_variable_prefix.strip() else [s.strip() for s in CONF.global_variable_prefix.split(',')],
392+
},
312393
'message': 'success'
313394
}
314395
resp.status = falcon.HTTP_200

artifacts-corepy/artifacts_corepy/apps/package/route.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ def __call__(self, req, resp, package_name, entity_name, action_name):
6464

6565

6666
def add_routes(api):
67+
# process
68+
api.add_route('/artifacts/process/definitions', controller.CollectionProcessDef())
69+
api.add_route('/artifacts/users', controller.CollectionUser())
70+
api.add_route('/artifacts/cidata/{citype}/query', controller.CollectionCiData())
6771
# cmdb api forward
6872
api.add_route('/artifacts/system-design-versions', controller.CollectionSystemDesign())
6973
api.add_route('/artifacts/system-design-versions/{rid}', controller.ItemSystemDesign())
@@ -74,6 +78,7 @@ def add_routes(api):
7478
api.add_route('/artifacts/enum/system/codes/{cat_id}', controller.ItemEnumCodes())
7579
api.add_route('/artifacts/ci-types/{ci_type_id}/operations', controller.ItemCITypeOperations())
7680
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/query', controller.CollectionUnitDesignPackages())
81+
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/statistics', controller.CollectionPackageStatistics())
7782
api.add_route('/artifacts/ci-types/{ci_type_id}/references/by', controller.ItemCiReferences())
7883
api.add_route('/artifacts/ci-types/{ci_type_id}/attributes', controller.ItemCiAttributes())
7984
api.add_route('/artifacts/ci-types/{ci_type_id}/ci-data/batch-delete', controller.CiDelete())
@@ -86,6 +91,8 @@ def add_routes(api):
8691
# nexus query
8792
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/queryNexusDirectiry',
8893
controller.CollectionUnitDesignNexusPackages())
94+
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/queryNexusPath',
95+
controller.ItemUnitDesignNexusPackages())
8996
# nexus upload
9097
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/uploadNexusPackage',
9198
controller.CollectionUnitDesignNexusPackageUpload())
@@ -122,3 +129,7 @@ def add_routes(api):
122129
controller.DownloadComposePackage())
123130
api.add_route('/artifacts/unit-designs/{unit_design_id}/packages/{deploy_package_id}/push',
124131
controller.PushComposePackage())
132+
133+
# system config
134+
api.add_route('/artifacts/sysconfig',
135+
controller.SystemConfig())

artifacts-corepy/artifacts_corepy/common/constant.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class PackageType(object):
88
db = 'DB'
99
mixed = 'APP&DB'
1010
image = 'IMAGE'
11+
rule = 'RULE'
1112
default = 'APP&DB'
1213

1314

artifacts-corepy/artifacts_corepy/common/nexus.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ def __init__(self, server, username, password):
2424
self.username = username
2525
self.password = password
2626

27-
def list(self, repository, path, extensions=None, continue_token=None, search_url='/service/rest/v1/search/assets'):
27+
def list(self, repository, path, extensions=None, continue_token=None, search_url='/service/rest/v1/search/assets', filename=None):
2828
results = []
2929
url = self.server + search_url
3030
# group必须以/开头且结尾不包含/
3131
group = path.lstrip('/')
3232
group = '/' + group.rstrip('/')
3333
query = {'repository': repository, 'group': group}
34+
if filename:
35+
query['q'] = filename
3436
if continue_token:
3537
query['continuationToken'] = continue_token
3638
LOG.info('GET %s', url)
@@ -50,10 +52,11 @@ def list(self, repository, path, extensions=None, continue_token=None, search_ur
5052
results.extend([{
5153
'name': i['path'].split('/')[-1],
5254
'downloadUrl': i['downloadUrl'],
53-
'md5': i.get('checksum', {}).get('md5', None)
55+
'md5': i.get('checksum', {}).get('md5', None) or i.get('checksum', {}).get('sha1', None) or 'N/A',
56+
'lastModified': i['lastModified'][:19]+'Z' if i.get('lastModified', None) else None
5457
} for i in filtered_items])
5558
if resp_json['continuationToken']:
56-
results.extend(self.list(repository, path, extensions, resp_json['continuationToken']))
59+
results.extend(self.list(repository, path, extensions, continue_token=resp_json['continuationToken'], filename=filename))
5760
return results
5861

5962
def upload(self, repository, path, filename, filetype, fileobj, upload_url='/service/rest/v1/components'):

0 commit comments

Comments
 (0)