Fix reading partial config
If the config on the disk doesn't have all fields, then the missing fields are now populated with their defaults.
This commit is contained in:
parent
3c9f4b10b4
commit
9ad19fbdd6
11 changed files with 734 additions and 40 deletions
138
config/store/fixtures/config_v1.json
Normal file
138
config/store/fixtures/config_v1.json
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
{
|
||||||
|
"created_at": "2022-11-08T12:01:22.533279+01:00",
|
||||||
|
"version": 1,
|
||||||
|
"id": "c5ea4473-2f84-417c-a0c6-35746bfc9fc9",
|
||||||
|
"name": "cool-breeze-4646",
|
||||||
|
"address": ":8080",
|
||||||
|
"update_check": true,
|
||||||
|
"log": {
|
||||||
|
"level": "info",
|
||||||
|
"topics": [],
|
||||||
|
"max_lines": 1000
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"dir": "./config"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"name": [],
|
||||||
|
"auto": true
|
||||||
|
},
|
||||||
|
"api": {
|
||||||
|
"read_only": false,
|
||||||
|
"access": {
|
||||||
|
"http": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"enable": false,
|
||||||
|
"disable_localhost": false,
|
||||||
|
"username": "",
|
||||||
|
"password": "",
|
||||||
|
"jwt": {
|
||||||
|
"secret": "L(*C[:uuHzL.]Fzpk$q=fa@PO=Z;j;56"
|
||||||
|
},
|
||||||
|
"auth0": {
|
||||||
|
"enable": false,
|
||||||
|
"tenants": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tls": {
|
||||||
|
"address": ":8181",
|
||||||
|
"enable": false,
|
||||||
|
"auto": false,
|
||||||
|
"cert_file": "",
|
||||||
|
"key_file": ""
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"disk": {
|
||||||
|
"dir": "./data",
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"cache": {
|
||||||
|
"enable": true,
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"ttl_seconds": 300,
|
||||||
|
"max_file_size_mbytes": 1,
|
||||||
|
"types": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"memory": {
|
||||||
|
"auth": {
|
||||||
|
"enable": true,
|
||||||
|
"username": "admin",
|
||||||
|
"password": "dcFsZVGwVFkv1bE8Rl"
|
||||||
|
},
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"purge": false
|
||||||
|
},
|
||||||
|
"cors": {
|
||||||
|
"origins": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mimetypes_file": "./mime.types"
|
||||||
|
},
|
||||||
|
"ffmpeg": {
|
||||||
|
"binary": "ffmpeg",
|
||||||
|
"max_processes": 0,
|
||||||
|
"access": {
|
||||||
|
"input": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"max_lines": 50,
|
||||||
|
"max_history": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playout": {
|
||||||
|
"enable": false,
|
||||||
|
"min_port": 0,
|
||||||
|
"max_port": 0
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"profiling": false,
|
||||||
|
"force_gc": 0
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_prometheus": false,
|
||||||
|
"range_sec": 300,
|
||||||
|
"interval_sec": 2
|
||||||
|
},
|
||||||
|
"sessions": {
|
||||||
|
"enable": true,
|
||||||
|
"ip_ignorelist": [
|
||||||
|
"127.0.0.1/32",
|
||||||
|
"::1/128"
|
||||||
|
],
|
||||||
|
"session_timeout_sec": 30,
|
||||||
|
"persist": false,
|
||||||
|
"persist_interval_sec": 300,
|
||||||
|
"max_bitrate_mbit": 0,
|
||||||
|
"max_sessions": 0
|
||||||
|
},
|
||||||
|
"service": {
|
||||||
|
"enable": false,
|
||||||
|
"token": "",
|
||||||
|
"url": "https://service.datarhei.com"
|
||||||
|
},
|
||||||
|
"router": {
|
||||||
|
"blocked_prefixes": [
|
||||||
|
"/api"
|
||||||
|
],
|
||||||
|
"routes": {},
|
||||||
|
"ui_path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
163
config/store/fixtures/config_v1_v3.json
Normal file
163
config/store/fixtures/config_v1_v3.json
Normal file
|
|
@ -0,0 +1,163 @@
|
||||||
|
{
|
||||||
|
"created_at": "2022-11-08T13:34:47.498911+01:00",
|
||||||
|
"version": 3,
|
||||||
|
"id": "c5ea4473-2f84-417c-a0c6-35746bfc9fc9",
|
||||||
|
"name": "cool-breeze-4646",
|
||||||
|
"address": ":8080",
|
||||||
|
"update_check": true,
|
||||||
|
"log": {
|
||||||
|
"level": "info",
|
||||||
|
"topics": [],
|
||||||
|
"max_lines": 1000
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"dir": "./config"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"name": [],
|
||||||
|
"auto": true
|
||||||
|
},
|
||||||
|
"api": {
|
||||||
|
"read_only": false,
|
||||||
|
"access": {
|
||||||
|
"http": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"enable": false,
|
||||||
|
"disable_localhost": false,
|
||||||
|
"username": "",
|
||||||
|
"password": "",
|
||||||
|
"jwt": {
|
||||||
|
"secret": "L(*C[:uuHzL.]Fzpk$q=fa@PO=Z;j;56"
|
||||||
|
},
|
||||||
|
"auth0": {
|
||||||
|
"enable": false,
|
||||||
|
"tenants": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tls": {
|
||||||
|
"address": ":8181",
|
||||||
|
"enable": false,
|
||||||
|
"auto": false,
|
||||||
|
"email": "cert@datarhei.com",
|
||||||
|
"cert_file": "",
|
||||||
|
"key_file": ""
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"disk": {
|
||||||
|
"dir": "./data",
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"cache": {
|
||||||
|
"enable": true,
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"ttl_seconds": 300,
|
||||||
|
"max_file_size_mbytes": 1,
|
||||||
|
"types": {
|
||||||
|
"allow": [],
|
||||||
|
"block": [
|
||||||
|
".m3u8",
|
||||||
|
".mpd"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"memory": {
|
||||||
|
"auth": {
|
||||||
|
"enable": true,
|
||||||
|
"username": "admin",
|
||||||
|
"password": "dcFsZVGwVFkv1bE8Rl"
|
||||||
|
},
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"purge": false
|
||||||
|
},
|
||||||
|
"cors": {
|
||||||
|
"origins": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mimetypes_file": "./mime.types"
|
||||||
|
},
|
||||||
|
"rtmp": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_tls": false,
|
||||||
|
"address": ":1935",
|
||||||
|
"address_tls": ":1936",
|
||||||
|
"app": "/",
|
||||||
|
"token": ""
|
||||||
|
},
|
||||||
|
"srt": {
|
||||||
|
"enable": false,
|
||||||
|
"address": ":6000",
|
||||||
|
"passphrase": "",
|
||||||
|
"token": "",
|
||||||
|
"log": {
|
||||||
|
"enable": false,
|
||||||
|
"topics": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ffmpeg": {
|
||||||
|
"binary": "ffmpeg",
|
||||||
|
"max_processes": 0,
|
||||||
|
"access": {
|
||||||
|
"input": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"max_lines": 50,
|
||||||
|
"max_history": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playout": {
|
||||||
|
"enable": false,
|
||||||
|
"min_port": 0,
|
||||||
|
"max_port": 0
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"profiling": false,
|
||||||
|
"force_gc": 0
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_prometheus": false,
|
||||||
|
"range_sec": 300,
|
||||||
|
"interval_sec": 2
|
||||||
|
},
|
||||||
|
"sessions": {
|
||||||
|
"enable": true,
|
||||||
|
"ip_ignorelist": [
|
||||||
|
"127.0.0.1/32",
|
||||||
|
"::1/128"
|
||||||
|
],
|
||||||
|
"session_timeout_sec": 30,
|
||||||
|
"persist": false,
|
||||||
|
"persist_interval_sec": 300,
|
||||||
|
"max_bitrate_mbit": 0,
|
||||||
|
"max_sessions": 0
|
||||||
|
},
|
||||||
|
"service": {
|
||||||
|
"enable": false,
|
||||||
|
"token": "",
|
||||||
|
"url": "https://service.datarhei.com"
|
||||||
|
},
|
||||||
|
"router": {
|
||||||
|
"blocked_prefixes": [
|
||||||
|
"/api"
|
||||||
|
],
|
||||||
|
"routes": {},
|
||||||
|
"ui_path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
140
config/store/fixtures/config_v2.json
Normal file
140
config/store/fixtures/config_v2.json
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
{
|
||||||
|
"created_at": "2022-11-08T11:54:44.224213+01:00",
|
||||||
|
"version": 2,
|
||||||
|
"id": "3bddc061-e534-4315-ab56-95b48c050ec9",
|
||||||
|
"name": "super-frog-1715",
|
||||||
|
"address": ":8080",
|
||||||
|
"update_check": true,
|
||||||
|
"log": {
|
||||||
|
"level": "info",
|
||||||
|
"topics": [],
|
||||||
|
"max_lines": 1000
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"dir": "./config"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"name": [],
|
||||||
|
"auto": true
|
||||||
|
},
|
||||||
|
"api": {
|
||||||
|
"read_only": false,
|
||||||
|
"access": {
|
||||||
|
"http": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"enable": false,
|
||||||
|
"disable_localhost": false,
|
||||||
|
"username": "",
|
||||||
|
"password": "",
|
||||||
|
"jwt": {
|
||||||
|
"secret": "u4+N,UDq]jGxGbbQLQN[!jcMsa\u0026weIJW"
|
||||||
|
},
|
||||||
|
"auth0": {
|
||||||
|
"enable": false,
|
||||||
|
"tenants": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tls": {
|
||||||
|
"address": ":8181",
|
||||||
|
"enable": false,
|
||||||
|
"auto": false,
|
||||||
|
"cert_file": "",
|
||||||
|
"key_file": ""
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"disk": {
|
||||||
|
"dir": "./data",
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"cache": {
|
||||||
|
"enable": true,
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"ttl_seconds": 300,
|
||||||
|
"max_file_size_mbytes": 1,
|
||||||
|
"types": [
|
||||||
|
".ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"memory": {
|
||||||
|
"auth": {
|
||||||
|
"enable": true,
|
||||||
|
"username": "admin",
|
||||||
|
"password": "DsAKRUg9wmOk4qpvvy"
|
||||||
|
},
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"purge": false
|
||||||
|
},
|
||||||
|
"cors": {
|
||||||
|
"origins": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mimetypes_file": "./mime.types"
|
||||||
|
},
|
||||||
|
"ffmpeg": {
|
||||||
|
"binary": "ffmpeg",
|
||||||
|
"max_processes": 0,
|
||||||
|
"access": {
|
||||||
|
"input": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"max_lines": 50,
|
||||||
|
"max_history": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playout": {
|
||||||
|
"enable": false,
|
||||||
|
"min_port": 0,
|
||||||
|
"max_port": 0
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"profiling": false,
|
||||||
|
"force_gc": 0
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_prometheus": false,
|
||||||
|
"range_sec": 300,
|
||||||
|
"interval_sec": 2
|
||||||
|
},
|
||||||
|
"sessions": {
|
||||||
|
"enable": true,
|
||||||
|
"ip_ignorelist": [
|
||||||
|
"127.0.0.1/32",
|
||||||
|
"::1/128"
|
||||||
|
],
|
||||||
|
"session_timeout_sec": 30,
|
||||||
|
"persist": false,
|
||||||
|
"persist_interval_sec": 300,
|
||||||
|
"max_bitrate_mbit": 0,
|
||||||
|
"max_sessions": 0
|
||||||
|
},
|
||||||
|
"service": {
|
||||||
|
"enable": false,
|
||||||
|
"token": "",
|
||||||
|
"url": "https://service.datarhei.com"
|
||||||
|
},
|
||||||
|
"router": {
|
||||||
|
"blocked_prefixes": [
|
||||||
|
"/api"
|
||||||
|
],
|
||||||
|
"routes": {},
|
||||||
|
"ui_path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
165
config/store/fixtures/config_v2_v3.json
Normal file
165
config/store/fixtures/config_v2_v3.json
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
{
|
||||||
|
"created_at": "2022-11-08T11:54:44.224213+01:00",
|
||||||
|
"version": 3,
|
||||||
|
"id": "3bddc061-e534-4315-ab56-95b48c050ec9",
|
||||||
|
"name": "super-frog-1715",
|
||||||
|
"address": ":8080",
|
||||||
|
"update_check": true,
|
||||||
|
"log": {
|
||||||
|
"level": "info",
|
||||||
|
"topics": [],
|
||||||
|
"max_lines": 1000
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"dir": "./config"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"name": [],
|
||||||
|
"auto": true
|
||||||
|
},
|
||||||
|
"api": {
|
||||||
|
"read_only": false,
|
||||||
|
"access": {
|
||||||
|
"http": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"enable": false,
|
||||||
|
"disable_localhost": false,
|
||||||
|
"username": "",
|
||||||
|
"password": "",
|
||||||
|
"jwt": {
|
||||||
|
"secret": "u4+N,UDq]jGxGbbQLQN[!jcMsa\u0026weIJW"
|
||||||
|
},
|
||||||
|
"auth0": {
|
||||||
|
"enable": false,
|
||||||
|
"tenants": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tls": {
|
||||||
|
"address": ":8181",
|
||||||
|
"enable": false,
|
||||||
|
"auto": false,
|
||||||
|
"cert_file": "",
|
||||||
|
"key_file": "",
|
||||||
|
"email": "cert@datarhei.com"
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"disk": {
|
||||||
|
"dir": "./data",
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"cache": {
|
||||||
|
"enable": true,
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"ttl_seconds": 300,
|
||||||
|
"max_file_size_mbytes": 1,
|
||||||
|
"types": {
|
||||||
|
"allow": [
|
||||||
|
".ts"
|
||||||
|
],
|
||||||
|
"block": [
|
||||||
|
".m3u8",
|
||||||
|
".mpd"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"memory": {
|
||||||
|
"auth": {
|
||||||
|
"enable": true,
|
||||||
|
"username": "admin",
|
||||||
|
"password": "DsAKRUg9wmOk4qpvvy"
|
||||||
|
},
|
||||||
|
"max_size_mbytes": 0,
|
||||||
|
"purge": false
|
||||||
|
},
|
||||||
|
"cors": {
|
||||||
|
"origins": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mimetypes_file": "./mime.types"
|
||||||
|
},
|
||||||
|
"rtmp": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_tls": false,
|
||||||
|
"address": ":1935",
|
||||||
|
"address_tls": ":1936",
|
||||||
|
"app": "/",
|
||||||
|
"token": ""
|
||||||
|
},
|
||||||
|
"srt": {
|
||||||
|
"enable": false,
|
||||||
|
"address": ":6000",
|
||||||
|
"passphrase": "",
|
||||||
|
"token": "",
|
||||||
|
"log": {
|
||||||
|
"enable": false,
|
||||||
|
"topics": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ffmpeg": {
|
||||||
|
"binary": "ffmpeg",
|
||||||
|
"max_processes": 0,
|
||||||
|
"access": {
|
||||||
|
"input": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"allow": [],
|
||||||
|
"block": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"max_lines": 50,
|
||||||
|
"max_history": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playout": {
|
||||||
|
"enable": false,
|
||||||
|
"min_port": 0,
|
||||||
|
"max_port": 0
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"profiling": false,
|
||||||
|
"force_gc": 0
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"enable": false,
|
||||||
|
"enable_prometheus": false,
|
||||||
|
"range_sec": 300,
|
||||||
|
"interval_sec": 2
|
||||||
|
},
|
||||||
|
"sessions": {
|
||||||
|
"enable": true,
|
||||||
|
"ip_ignorelist": [
|
||||||
|
"127.0.0.1/32",
|
||||||
|
"::1/128"
|
||||||
|
],
|
||||||
|
"session_timeout_sec": 30,
|
||||||
|
"persist": false,
|
||||||
|
"persist_interval_sec": 300,
|
||||||
|
"max_bitrate_mbit": 0,
|
||||||
|
"max_sessions": 0
|
||||||
|
},
|
||||||
|
"service": {
|
||||||
|
"enable": false,
|
||||||
|
"token": "",
|
||||||
|
"url": "https://service.datarhei.com"
|
||||||
|
},
|
||||||
|
"router": {
|
||||||
|
"blocked_prefixes": [
|
||||||
|
"/api"
|
||||||
|
],
|
||||||
|
"routes": {},
|
||||||
|
"ui_path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -118,48 +118,12 @@ func (c *jsonStore) load(cfg *config.Config) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
dataV3 := &config.Data{}
|
data, err := migrate(jsondata)
|
||||||
|
if err != nil {
|
||||||
version := DataVersion{}
|
return err
|
||||||
|
|
||||||
if err = gojson.Unmarshal(jsondata, &version); err != nil {
|
|
||||||
return json.FormatError(jsondata, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if version.Version == 1 {
|
cfg.Data = *data
|
||||||
dataV1 := &v1.Data{}
|
|
||||||
|
|
||||||
if err = gojson.Unmarshal(jsondata, dataV1); err != nil {
|
|
||||||
return json.FormatError(jsondata, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dataV2, err := v2.UpgradeV1ToV2(dataV1)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataV3, err = config.UpgradeV2ToV3(dataV2)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else if version.Version == 2 {
|
|
||||||
dataV2 := &v2.Data{}
|
|
||||||
|
|
||||||
if err = gojson.Unmarshal(jsondata, dataV2); err != nil {
|
|
||||||
return json.FormatError(jsondata, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dataV3, err = config.UpgradeV2ToV3(dataV2)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else if version.Version == 3 {
|
|
||||||
if err = gojson.Unmarshal(jsondata, dataV3); err != nil {
|
|
||||||
return json.FormatError(jsondata, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg.Data = *dataV3
|
|
||||||
|
|
||||||
cfg.LoadedAt = time.Now()
|
cfg.LoadedAt = time.Now()
|
||||||
cfg.UpdatedAt = cfg.LoadedAt
|
cfg.UpdatedAt = cfg.LoadedAt
|
||||||
|
|
@ -202,3 +166,55 @@ func (c *jsonStore) store(data *config.Config) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func migrate(jsondata []byte) (*config.Data, error) {
|
||||||
|
data := &config.Data{}
|
||||||
|
version := DataVersion{}
|
||||||
|
|
||||||
|
if err := gojson.Unmarshal(jsondata, &version); err != nil {
|
||||||
|
return nil, json.FormatError(jsondata, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if version.Version == 1 {
|
||||||
|
dataV1 := &v1.New().Data
|
||||||
|
|
||||||
|
if err := gojson.Unmarshal(jsondata, dataV1); err != nil {
|
||||||
|
return nil, json.FormatError(jsondata, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dataV2, err := v2.UpgradeV1ToV2(dataV1)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dataV3, err := config.UpgradeV2ToV3(dataV2)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data = dataV3
|
||||||
|
} else if version.Version == 2 {
|
||||||
|
dataV2 := &v2.New().Data
|
||||||
|
|
||||||
|
if err := gojson.Unmarshal(jsondata, dataV2); err != nil {
|
||||||
|
return nil, json.FormatError(jsondata, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dataV3, err := config.UpgradeV2ToV3(dataV2)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data = dataV3
|
||||||
|
} else if version.Version == 3 {
|
||||||
|
dataV3 := &config.New().Data
|
||||||
|
|
||||||
|
if err := gojson.Unmarshal(jsondata, dataV3); err != nil {
|
||||||
|
return nil, json.FormatError(jsondata, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data = dataV3
|
||||||
|
}
|
||||||
|
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
50
config/store/json_test.go
Normal file
50
config/store/json_test.go
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/datarhei/core/v16/config"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMigrationV1ToV3(t *testing.T) {
|
||||||
|
jsondatav1, err := os.ReadFile("./fixtures/config_v1.json")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
jsondatav3, err := os.ReadFile("./fixtures/config_v1_v3.json")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
datav3 := config.New()
|
||||||
|
json.Unmarshal(jsondatav3, datav3)
|
||||||
|
|
||||||
|
data, err := migrate(jsondatav1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
datav3.Data.CreatedAt = time.Time{}
|
||||||
|
data.CreatedAt = time.Time{}
|
||||||
|
|
||||||
|
require.Equal(t, datav3.Data, *data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMigrationV2ToV3(t *testing.T) {
|
||||||
|
jsondatav2, err := os.ReadFile("./fixtures/config_v2.json")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
jsondatav3, err := os.ReadFile("./fixtures/config_v2_v3.json")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
datav3 := config.New()
|
||||||
|
json.Unmarshal(jsondatav3, datav3)
|
||||||
|
|
||||||
|
data, err := migrate(jsondatav2)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
datav3.Data.CreatedAt = time.Time{}
|
||||||
|
data.CreatedAt = time.Time{}
|
||||||
|
|
||||||
|
require.Equal(t, datav3.Data, *data)
|
||||||
|
}
|
||||||
|
|
@ -28,6 +28,7 @@ func NewTenantList(p *[]Auth0Tenant, val []Auth0Tenant, separator string) *Tenan
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ type Address string
|
||||||
|
|
||||||
func NewAddress(p *string, val string) *Address {
|
func NewAddress(p *string, val string) *Address {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Address)(p)
|
return (*Address)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,7 +67,9 @@ func NewCIDRList(p *[]string, val []string, separator string) *CIDRList {
|
||||||
p: p,
|
p: p,
|
||||||
separator: separator,
|
separator: separator,
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -120,7 +123,9 @@ func NewCORSOrigins(p *[]string, val []string, separator string) *CORSOrigins {
|
||||||
p: p,
|
p: p,
|
||||||
separator: separator,
|
separator: separator,
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,6 +166,7 @@ type Port int
|
||||||
|
|
||||||
func NewPort(p *int, val int) *Port {
|
func NewPort(p *int, val int) *Port {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Port)(p)
|
return (*Port)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -197,6 +203,7 @@ type URL string
|
||||||
|
|
||||||
func NewURL(p *string, val string) *URL {
|
func NewURL(p *string, val string) *URL {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*URL)(p)
|
return (*URL)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,6 +245,7 @@ type Email string
|
||||||
|
|
||||||
func NewEmail(p *string, val string) *Email {
|
func NewEmail(p *string, val string) *Email {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Email)(p)
|
return (*Email)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ type MustDir string
|
||||||
|
|
||||||
func NewMustDir(p *string, val string) *MustDir {
|
func NewMustDir(p *string, val string) *MustDir {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*MustDir)(p)
|
return (*MustDir)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,6 +56,7 @@ type Dir string
|
||||||
|
|
||||||
func NewDir(p *string, val string) *Dir {
|
func NewDir(p *string, val string) *Dir {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Dir)(p)
|
return (*Dir)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -96,6 +98,7 @@ type Exec string
|
||||||
|
|
||||||
func NewExec(p *string, val string) *Exec {
|
func NewExec(p *string, val string) *Exec {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Exec)(p)
|
return (*Exec)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -129,6 +132,7 @@ type File string
|
||||||
|
|
||||||
func NewFile(p *string, val string) *File {
|
func NewFile(p *string, val string) *File {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*File)(p)
|
return (*File)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,6 +174,7 @@ type AbsolutePath string
|
||||||
|
|
||||||
func NewAbsolutePath(p *string, val string) *AbsolutePath {
|
func NewAbsolutePath(p *string, val string) *AbsolutePath {
|
||||||
*p = filepath.Clean(val)
|
*p = filepath.Clean(val)
|
||||||
|
|
||||||
return (*AbsolutePath)(p)
|
return (*AbsolutePath)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ type String string
|
||||||
|
|
||||||
func NewString(p *string, val string) *String {
|
func NewString(p *string, val string) *String {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*String)(p)
|
return (*String)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,7 +44,9 @@ func NewStringList(p *[]string, val []string, separator string) *StringList {
|
||||||
p: p,
|
p: p,
|
||||||
separator: separator,
|
separator: separator,
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,6 +152,7 @@ type Bool bool
|
||||||
|
|
||||||
func NewBool(p *bool, val bool) *Bool {
|
func NewBool(p *bool, val bool) *Bool {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Bool)(p)
|
return (*Bool)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -179,6 +183,7 @@ type Int int
|
||||||
|
|
||||||
func NewInt(p *int, val int) *Int {
|
func NewInt(p *int, val int) *Int {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Int)(p)
|
return (*Int)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -209,6 +214,7 @@ type Int64 int64
|
||||||
|
|
||||||
func NewInt64(p *int64, val int64) *Int64 {
|
func NewInt64(p *int64, val int64) *Int64 {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Int64)(p)
|
return (*Int64)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -239,6 +245,7 @@ type Uint64 uint64
|
||||||
|
|
||||||
func NewUint64(p *uint64, val uint64) *Uint64 {
|
func NewUint64(p *uint64, val uint64) *Uint64 {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Uint64)(p)
|
return (*Uint64)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ type Time time.Time
|
||||||
|
|
||||||
func NewTime(p *time.Time, val time.Time) *Time {
|
func NewTime(p *time.Time, val time.Time) *Time {
|
||||||
*p = val
|
*p = val
|
||||||
|
|
||||||
return (*Time)(p)
|
return (*Time)(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue