Small Tests and repo fixes (#80)

* Small organisational fixes

* Add some new common tests
This commit is contained in:
Kjeld Schouten-Lebbing 2021-02-09 19:13:56 +01:00 committed by kjeld Schouten-Lebbing
parent 57b5438842
commit 492730454e
No known key found for this signature in database
GPG Key ID: 4CDAD4A532BC1EDB
10 changed files with 284 additions and 41 deletions

View File

@ -6,16 +6,15 @@ Fixes # (issue)
**Type of change** **Type of change**
- [ ] Feature/App addition
- [ ] Bugfix
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Refactor of current code - [ ] Refactor of current code
- [ ] This change requires additional documentation update
**How Has This Been Tested?** **How Has This Been Tested?**
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
- Test A
- Test B
**Notes:** **Notes:**
_Please enter any other relevant information here_ _Please enter any other relevant information here_
@ -27,5 +26,4 @@ _Please enter any other relevant information here_
- [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation - [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings - [ ] My changes generate no new warnings
- [ ] I have added tests to this description that prove my fix is effective or that my feature works - [ ] I have added tests to this description that prove my fix is effective or that my feature works
- [ ] Any new files are named using lowercase (to avoid issues on case sensitive file systems)

4
.github/SECURITY.md vendored
View File

@ -4,8 +4,8 @@
| Branch | TrueNAS version | Supported with updates | | Branch | TrueNAS version | Supported with updates |
| ------- | ------- |------------------ | | ------- | ------- |------------------ |
| MASTER | BETA | NOT RELEASED YET | | MASTER | 21.02 ALPHA | :white_check_mark: |
| DEV | 20.21-ALPHA | :white_check_mark: | | Charts | Standard Kubernetes/Helm | :white_check_mark: |
## Reporting a Vulnerability ## Reporting a Vulnerability

3
.gitignore vendored
View File

@ -34,4 +34,5 @@ npm-debug.log
tests/artifacts/ tests/artifacts/
tests/test-report.txt tests/test-report.txt
tests/test-report.xml tests/test-report.xml
private_values.yaml private_values.yaml
temp/

9
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,9 @@
# See https://pre-commit.com for more information
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: end-of-file-fixer
exclude: '\.github(.+)'
- id: trailing-whitespace
exclude: '\.github(.+)'

View File

@ -23,4 +23,4 @@
"stable": {"min": "20.12-ALPHA"}, "stable": {"min": "20.12-ALPHA"},
"nightlies": {"min": "20.12-MASTER"} "nightlies": {"min": "20.12-MASTER"}
} }
} }

View File

@ -1,7 +1,7 @@
apiVersion: v2 apiVersion: v2
name: common-test name: common-test
description: Helper chart to test different use cases of the common library description: Helper chart to test different use cases of the common library
version: 1.1.0 version: 1.2.0
keywords: keywords:
- truecharts - truecharts
- common - common

View File

@ -10,21 +10,6 @@ service:
ingress: ingress:
enabled: true enabled: true
appIngressEnabled: true
appIngress:
main:
enabled: true
appVolumesEnabled: false
appVolumeMounts:
data:
enabled: true
emptyDir: true
datasetName: "data"
mountPath: "/data"
hostPathEnabled: false
hostPath: ""
probes: probes:
liveness: liveness:
enabled: true enabled: true
@ -32,3 +17,59 @@ probes:
enabled: true enabled: true
startup: startup:
enabled: true enabled: true
appIngressEnabled: true
appIngress:
main:
enabled: true
mainhttp:
enabled: true
entrypoint: "web"
certType: ""
existingcert: ""
authForwardURL: ""
annotations: {}
labels: {}
hosts:
- host: app.truecharts.placeholder
paths:
- path: /
# Ignored if not kubeVersion >= 1.14-0
pathType: Prefix
appVolumesEnabled: true
appVolumeMounts:
data:
enabled: true
emptyDir: true
datasetName: "data"
mountPath: "/data"
hostPathEnabled: true
hostPath: "/tmp"
test:
enabled: true
emptyDir: true
datasetName: "test"
mountPath: "/test"
hostPathEnabled: true
hostPath: "/tmp"
appAdditionalServicesEnabled: true
appAdditionalServices:
extra-tcp:
enabled: true
type: ClusterIP
port:
port: 51414
name: tcp-test
protocol: TCP
targetPort: 51414
extra-udp:
enabled: true
type: ClusterIP
port:
port: 51414
name: udp-test
protocol: UDP
targetPort: 51414

View File

@ -10,27 +10,12 @@ service:
ingress: ingress:
enabled: true enabled: true
appIngressEnabled: true
appIngress:
main:
enabled: true
persistence: persistence:
config: config:
enabled: true enabled: true
emptyDir: true emptyDir: true
mountPath: /www/assets mountPath: /www/assets
appVolumesEnabled: false
appVolumeMounts:
data:
enabled: true
emptyDir: true
datasetName: "data"
mountPath: "/data"
hostPathEnabled: false
hostPath: ""
addons: addons:
codeserver: codeserver:
enabled: true enabled: true
@ -40,3 +25,58 @@ addons:
volumeMounts: volumeMounts:
- name: config - name: config
mountPath: /www/assets mountPath: /www/assets
appIngressEnabled: true
appIngress:
main:
enabled: true
mainhttp:
enabled: true
entrypoint: "web"
certType: ""
existingcert: ""
authForwardURL: ""
annotations: {}
labels: {}
hosts:
- host: app.truecharts.placeholder
paths:
- path: /
# Ignored if not kubeVersion >= 1.14-0
pathType: Prefix
appVolumesEnabled: true
appVolumeMounts:
data:
enabled: true
emptyDir: true
datasetName: "data"
mountPath: "/data"
hostPathEnabled: true
hostPath: "/tmp"
test:
enabled: true
emptyDir: true
datasetName: "test"
mountPath: "/test"
hostPathEnabled: true
hostPath: "/tmp"
appAdditionalServicesEnabled: true
appAdditionalServices:
extra-tcp:
enabled: true
type: ClusterIP
port:
port: 51414
name: tcp-test
protocol: TCP
targetPort: 51414
extra-udp:
enabled: true
type: ClusterIP
port:
port: 51414
name: udp-test
protocol: UDP
targetPort: 51414

View File

@ -37,4 +37,30 @@ appVolumeMounts:
datasetName: "data" datasetName: "data"
mountPath: "/data" mountPath: "/data"
hostPathEnabled: false hostPathEnabled: false
hostPath: "" hostPath: ""
test:
enabled: true
emptyDir: true
datasetName: "test"
mountPath: "/test"
hostPathEnabled: false
hostPath: ""
appAdditionalServicesEnabled: true
appAdditionalServices:
extra-tcp:
enabled: true
type: ClusterIP
port:
port: 51414
name: tcp-test
protocol: TCP
targetPort: 51414
extra-udp:
enabled: true
type: ClusterIP
port:
port: 51414
name: udp-test
protocol: UDP
targetPort: 51414

128
update_dependencies Normal file
View File

@ -0,0 +1,128 @@
#!/usr/bin/env python3
import argparse
import errno
import os
import subprocess
from collections import defaultdict
ITEMS = defaultdict(lambda: {'success': [], 'error': []})
class ValidationException(Exception):
def __init__(self, error_msg, error_no=errno.EFAULT):
self.errmsg = error_msg
self.errno = error_no
def get_error_name(self):
return errno.errorcode.get(self.errno) or 'EUNKNOWN'
def __str__(self):
return f'[{self.get_error_name()}] {self.errmsg}'
class NotFoundException(ValidationException):
def __init__(self, error):
super().__init__(error, errno.ENOENT)
class TrainNotFoundException(NotFoundException):
def __init__(self):
super(TrainNotFoundException, self).__init__('Failed to find train')
class CatalogItemNotFoundException(NotFoundException):
def __init__(self, path):
super(CatalogItemNotFoundException, self).__init__(f'Failed to find {path!r} catalog item')
def report_result():
print('[\033[94mINFO\x1B[0m]\tExecution Complete')
for index, item in enumerate(ITEMS):
index += 1
data = ITEMS[item]
print(f'\n[\033[94mINFO\x1B[0m]\t{index}) {item}')
if data['success']:
print(
f'[\033[92mOK\x1B[0m]\t - Successfully updated dependencies for {", ".join(data["success"])} versions'
)
for i_v, version in enumerate(data['error']):
v_name, error = version
print(
f'[\033[91mFAILED\x1B[0m]\t ({i_v + 1}) Failed to update dependencies for {v_name!r} version: {error}'
)
def update_train_charts(train_path, commit):
# We will gather all charts in the train and then for each chart all it's versions will be updated
if not os.path.exists(train_path):
raise TrainNotFoundException()
print(f'[\033[94mINFO\x1B[0m]\tProcessing {train_path!r} train')
for item in os.listdir(train_path):
process_catalog_item(os.path.join(train_path, item))
report_result()
if commit and any(ITEMS[item]['success'] for item in ITEMS):
if any(ITEMS[item]['error'] for item in ITEMS):
print(f'[\033[91mFAILED\x1B[0m]\tNot committing changes as failures detected')
else:
commit_msg = f'Updated catalog item dependencies ({train_path.rsplit("/", 1)[-1]} train)\n' \
'Following items were updated:\n'
for item in ITEMS:
commit_msg += f'Updated {item} ({", ".join(ITEMS[item]["success"])} versions)\n\n'
for cmd in (
['git', '-C', train_path, 'add', train_path],
['git', '-C', train_path, 'commit', '-m', commit_msg]
):
cp = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
stderr = cp.communicate()[1]
if cp.returncode:
print(f'[\033[91mFAILED\x1B[0m]\tFailed to execute {" ".join(cmd)}: {stderr.decode()}')
exit(1)
print('[\033[92mOK\x1B[0m]\tChanges committed successfully')
def process_catalog_item(item_path):
if not os.path.exists(item_path):
raise CatalogItemNotFoundException(item_path)
item_name = item_path.rsplit('/', 1)[-1]
print(f'[\033[94mINFO\x1B[0m]\tProcessing {item_name!r} catalog item')
for item_version in os.listdir(item_path):
if os.path.isdir(os.path.join(item_path, item_version)):
update_item_version(item_name, item_version, os.path.join(item_path, item_version))
def update_item_version(item_name, version, version_path):
cp = subprocess.Popen(
['helm', 'dependency', 'update', version_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
stdout, stderr = cp.communicate()
if cp.returncode:
ITEMS[item_name]['error'].append((version, stderr.decode()))
else:
ITEMS[item_name]['success'].append(version)
def main():
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='sub-command help', dest='action')
parser_setup = subparsers.add_parser('update', help='Update dependencies for specified train')
parser_setup.add_argument('--train', help='Specify train path to update dependencies', required=True)
parser_setup.add_argument('--commit', help='Commit after updating dependencies', default=False)
args = parser.parse_args()
if args.action == 'update':
update_train_charts(args.train, args.commit)
else:
parser.print_help()
if __name__ == '__main__':
main()