mirror of
https://github.com/camptocamp/odoo-cloud-platform.git
synced 2026-06-24 16:48:36 +00:00
Add support of 'labs' RUNNING_ENV in cloud_platform
The labs env can be anything starting by 'labs', such as 'labs-logistics', 'labs-finance', ... * At install, s3/swift is set as default storage * However, unlike prod/integration, the storage is not forced to be an object storage * Redis is required * When the storage is set on s3/swift, then the bucket name is mandatory (otherwise, there is no place where to create the files...) The redis prefix regex match is relaxed: anything starting by a project name, then '-odoo-', then any combination of letters, digits, and dashes is accepted (so a prefix my-project9-odoo-labs-web3 is valid).
This commit is contained in:
@@ -50,6 +50,7 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
configs = {
|
configs = {
|
||||||
'prod': PlatformConfig(filestore=FilestoreKind.s3),
|
'prod': PlatformConfig(filestore=FilestoreKind.s3),
|
||||||
'integration': PlatformConfig(filestore=FilestoreKind.s3),
|
'integration': PlatformConfig(filestore=FilestoreKind.s3),
|
||||||
|
'labs': PlatformConfig(filestore=FilestoreKind.s3),
|
||||||
'test': PlatformConfig(filestore=FilestoreKind.db),
|
'test': PlatformConfig(filestore=FilestoreKind.db),
|
||||||
'dev': PlatformConfig(filestore=FilestoreKind.db),
|
'dev': PlatformConfig(filestore=FilestoreKind.db),
|
||||||
}
|
}
|
||||||
@@ -71,13 +72,21 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
def install_exoscale(self):
|
def install_exoscale(self):
|
||||||
self.install('exoscale')
|
self.install('exoscale')
|
||||||
|
|
||||||
|
def _get_running_env(self):
|
||||||
|
environment_name = config['running_env']
|
||||||
|
if environment_name.startswith('labs'):
|
||||||
|
# We allow to have environments such as 'labs-logistics'
|
||||||
|
# or 'labs-finance', in order to have the matching ribbon.
|
||||||
|
environment_name = 'labs'
|
||||||
|
return environment_name
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def install(self, platform_kind):
|
def install(self, platform_kind):
|
||||||
assert platform_kind in self._platform_kinds()
|
assert platform_kind in self._platform_kinds()
|
||||||
params = self.env['ir.config_parameter'].sudo()
|
params = self.env['ir.config_parameter'].sudo()
|
||||||
params.set_param('cloud.platform.kind', platform_kind)
|
params.set_param('cloud.platform.kind', platform_kind)
|
||||||
environment = config['running_env']
|
environment_name = self._get_running_env()
|
||||||
configs = self._config_by_server_env(platform_kind, environment)
|
configs = self._config_by_server_env(platform_kind, environment_name)
|
||||||
params.set_param('ir_attachment.location', configs.filestore)
|
params.set_param('ir_attachment.location', configs.filestore)
|
||||||
self.check()
|
self.check()
|
||||||
if configs.filestore in [FilestoreKind.swift, FilestoreKind.s3]:
|
if configs.filestore in [FilestoreKind.swift, FilestoreKind.s3]:
|
||||||
@@ -90,6 +99,9 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
use_swift = (params.get_param('ir_attachment.location') ==
|
use_swift = (params.get_param('ir_attachment.location') ==
|
||||||
FilestoreKind.swift)
|
FilestoreKind.swift)
|
||||||
if environment_name in ('prod', 'integration'):
|
if environment_name in ('prod', 'integration'):
|
||||||
|
# Labs instances use swift or s3 by default, but we don't want
|
||||||
|
# to enforce it in case we want to test something with a different
|
||||||
|
# storage. At your own risks!
|
||||||
assert use_swift, (
|
assert use_swift, (
|
||||||
"Swift must be used on production and integration instances. "
|
"Swift must be used on production and integration instances. "
|
||||||
"It is activated, setting 'ir_attachment.location.' to 'swift'"
|
"It is activated, setting 'ir_attachment.location.' to 'swift'"
|
||||||
@@ -109,13 +121,16 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
"SWIFT_PASSWORD environment variable is required when "
|
"SWIFT_PASSWORD environment variable is required when "
|
||||||
"ir_attachment.location is 'swift'."
|
"ir_attachment.location is 'swift'."
|
||||||
)
|
)
|
||||||
container_name = os.environ['SWIFT_WRITE_CONTAINER']
|
container_name = os.environ.get('SWIFT_WRITE_CONTAINER')
|
||||||
if environment_name in ('integration', 'prod'):
|
|
||||||
assert container_name, (
|
assert container_name, (
|
||||||
"SWIFT_WRITE_CONTAINER must not be empty for prod "
|
"SWIFT_WRITE_CONTAINER environment variable is required when "
|
||||||
"and integration"
|
"ir_attachment.location is 'swift'.\n"
|
||||||
|
"Normally, 'swift' is activated on labs, integration "
|
||||||
|
"and production, but should not be used in dev environment"
|
||||||
|
" (or using a dedicated dev bucket, never using the "
|
||||||
|
"integration/prod bucket)."
|
||||||
)
|
)
|
||||||
prod_container = bool(re.match(r'[a-z]+-odoo-prod',
|
prod_container = bool(re.match(r'[a-z0-9-]+-odoo-prod',
|
||||||
container_name))
|
container_name))
|
||||||
if environment_name == 'prod':
|
if environment_name == 'prod':
|
||||||
assert prod_container, (
|
assert prod_container, (
|
||||||
@@ -142,6 +157,9 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
params = self.env['ir.config_parameter'].sudo()
|
params = self.env['ir.config_parameter'].sudo()
|
||||||
use_s3 = params.get_param('ir_attachment.location') == FilestoreKind.s3
|
use_s3 = params.get_param('ir_attachment.location') == FilestoreKind.s3
|
||||||
if environment_name in ('prod', 'integration'):
|
if environment_name in ('prod', 'integration'):
|
||||||
|
# Labs instances use swift or s3 by default, but we don't want
|
||||||
|
# to enforce it in case we want to test something with a different
|
||||||
|
# storage. At your own risks!
|
||||||
assert use_s3, (
|
assert use_s3, (
|
||||||
"S3 must be used on production and integration instances. "
|
"S3 must be used on production and integration instances. "
|
||||||
"It is activated by setting 'ir_attachment.location.' to 's3'."
|
"It is activated by setting 'ir_attachment.location.' to 's3'."
|
||||||
@@ -157,21 +175,16 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
"AWS_SECRET_ACCESS_KEY environment variable is required when "
|
"AWS_SECRET_ACCESS_KEY environment variable is required when "
|
||||||
"ir_attachment.location is 's3'."
|
"ir_attachment.location is 's3'."
|
||||||
)
|
)
|
||||||
assert os.environ.get('AWS_BUCKETNAME'), (
|
bucket_name = os.environ.get('AWS_BUCKETNAME')
|
||||||
|
assert bucket_name, (
|
||||||
"AWS_BUCKETNAME environment variable is required when "
|
"AWS_BUCKETNAME environment variable is required when "
|
||||||
"ir_attachment.location is 's3'.\n"
|
"ir_attachment.location is 's3'.\n"
|
||||||
"Normally, 's3' is activated on integration and production, "
|
"Normally, 's3' is activated on labs, integration "
|
||||||
"but should not be used in dev environment (or at least "
|
"and production, but should not be used in dev environment"
|
||||||
"not with a dev bucket, but never the "
|
" (or using a dedicated dev bucket, never using the "
|
||||||
"integration/prod bucket)."
|
"integration/prod bucket)."
|
||||||
)
|
)
|
||||||
bucket_name = os.environ['AWS_BUCKETNAME']
|
prod_bucket = bool(re.match(r'[a-z-0-9]+-odoo-prod', bucket_name))
|
||||||
if environment_name in ('integration', 'prod'):
|
|
||||||
assert bucket_name, (
|
|
||||||
"AWS_BUCKETNAME must not be empty for prod "
|
|
||||||
"and integration"
|
|
||||||
)
|
|
||||||
prod_bucket = bool(re.match(r'[a-z0-9-_]+-odoo-prod', bucket_name))
|
|
||||||
if environment_name == 'prod':
|
if environment_name == 'prod':
|
||||||
assert prod_bucket, (
|
assert prod_bucket, (
|
||||||
"AWS_BUCKETNAME should match '<client>-odoo-prod', "
|
"AWS_BUCKETNAME should match '<client>-odoo-prod', "
|
||||||
@@ -195,10 +208,10 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _check_redis(self, environment_name):
|
def _check_redis(self, environment_name):
|
||||||
if environment_name in ('prod', 'integration', 'test'):
|
if environment_name in ('prod', 'integration', 'labs', 'test'):
|
||||||
assert is_true(os.environ.get('ODOO_SESSION_REDIS')), (
|
assert is_true(os.environ.get('ODOO_SESSION_REDIS')), (
|
||||||
"Redis must be activated on prod, integration, test instances."
|
"Redis must be activated on prod, integration, labs,"
|
||||||
"This is done by setting ODOO_SESSION_REDIS=1."
|
" test instances. This is done by setting ODOO_SESSION_REDIS=1."
|
||||||
)
|
)
|
||||||
assert (os.environ.get('ODOO_SESSION_REDIS_HOST') or
|
assert (os.environ.get('ODOO_SESSION_REDIS_HOST') or
|
||||||
os.environ.get('ODOO_SESSION_REDIS_SENTINEL_HOST')), (
|
os.environ.get('ODOO_SESSION_REDIS_SENTINEL_HOST')), (
|
||||||
@@ -211,7 +224,7 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
prefix = os.environ['ODOO_SESSION_REDIS_PREFIX']
|
prefix = os.environ['ODOO_SESSION_REDIS_PREFIX']
|
||||||
assert re.match(r'[a-z]+[a-z0-9]*-odoo-[a-z]+[0-9]*', prefix), (
|
assert re.match(r'^[a-z-0-9]+-odoo-[a-z-0-9]+$', prefix), (
|
||||||
"ODOO_SESSION_REDIS_PREFIX must match '<client>-odoo-<env>'"
|
"ODOO_SESSION_REDIS_PREFIX must match '<client>-odoo-<env>'"
|
||||||
", we got: '%s'" % (prefix,)
|
", we got: '%s'" % (prefix,)
|
||||||
)
|
)
|
||||||
@@ -231,7 +244,7 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
"probably run 'env['cloud.platform'].install_exoscale()'"
|
"probably run 'env['cloud.platform'].install_exoscale()'"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
environment_name = config['running_env']
|
environment_name = self._get_running_env()
|
||||||
if kind == 'exoscale':
|
if kind == 'exoscale':
|
||||||
self._check_s3(environment_name)
|
self._check_s3(environment_name)
|
||||||
elif kind == 'ovh':
|
elif kind == 'ovh':
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class CloudPlatform(models.AbstractModel):
|
|||||||
configs = {
|
configs = {
|
||||||
'prod': PlatformConfig(filestore=FilestoreKind.swift),
|
'prod': PlatformConfig(filestore=FilestoreKind.swift),
|
||||||
'integration': PlatformConfig(filestore=FilestoreKind.swift),
|
'integration': PlatformConfig(filestore=FilestoreKind.swift),
|
||||||
|
'labs': PlatformConfig(filestore=FilestoreKind.swift),
|
||||||
'test': PlatformConfig(filestore=FilestoreKind.db),
|
'test': PlatformConfig(filestore=FilestoreKind.db),
|
||||||
'dev': PlatformConfig(filestore=FilestoreKind.db),
|
'dev': PlatformConfig(filestore=FilestoreKind.db),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user