Skip to content

Commit

Permalink
Add support of 'labs' RUNNING_ENV in cloud_platform
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
guewen authored and sebalix committed Jan 23, 2020
1 parent af82b8f commit bf35de5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 20 deletions.
57 changes: 37 additions & 20 deletions cloud_platform/models/cloud_platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ def _config_by_server_env(self, platform_kind, environment):
configs = configs_getter() if configs_getter else {}
return configs.get(environment) or FilestoreKind.db

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

# Due to the addition of the ovh cloud platform
# This will be moved to cloud_platform_exoscale on v11
def install_exoscale(self, cr, uid, context=None):
Expand All @@ -76,8 +84,8 @@ def install(self, cr, uid, platform_kind, context=None):
'cloud.platform.kind', platform_kind,
context=context
)
environment = config['running_env']
configs = self._config_by_server_env(platform_kind, environment)
environment_name = self._get_running_env()
configs = self._config_by_server_env(platform_kind, environment_name)
params.set_param(
cr, SUPERUSER_ID,
'ir_attachment.location', configs.filestore,
Expand All @@ -98,6 +106,9 @@ def _check_swift(self, cr, uid, environment_name, context=None):
) == FilestoreKind.swift
)
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, (
"Swift must be used on production and integration instances. "
"It is activated, setting 'ir_attachment.location.' to 'swift'"
Expand All @@ -117,13 +128,16 @@ def _check_swift(self, cr, uid, environment_name, context=None):
"SWIFT_PASSWORD environment variable is required when "
"ir_attachment.location is 'swift'."
)
container_name = os.environ['SWIFT_WRITE_CONTAINER']
if environment_name in ('integration', 'prod'):
assert container_name, (
"SWIFT_WRITE_CONTAINER must not be empty for prod "
"and integration"
)
prod_container = bool(re.match(r'[a-z0-9_-]+-odoo-prod',
container_name = os.environ.get('SWIFT_WRITE_CONTAINER')
assert container_name, (
"SWIFT_WRITE_CONTAINER environment variable is required when "
"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-z0-9-]+-odoo-prod',
container_name))
if environment_name == 'prod':
assert prod_container, (
Expand Down Expand Up @@ -152,6 +166,9 @@ def _check_s3(self, cr, uid, environment_name, context=None):
cr, SUPERUSER_ID, 'ir_attachment.location', context=context
) == FilestoreKind.s3
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, (
"S3 must be used on production and integration instances. "
"It is activated by setting 'ir_attachment.location.' to 's3'."
Expand All @@ -167,16 +184,16 @@ def _check_s3(self, cr, uid, environment_name, context=None):
"AWS_SECRET_ACCESS_KEY environment variable is required when "
"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 "
"ir_attachment.location is 's3'.\n"
"Normally, 's3' is activated on integration and production, "
"but should not be used in dev environment (or at least "
"not with a dev bucket, but never the "
"Normally, 's3' 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)."
)
bucket_name = os.environ['AWS_BUCKETNAME']
prod_bucket = bool(re.match(r'[a-z0-9_-]+-odoo-prod', bucket_name))
prod_bucket = bool(re.match(r'[a-z-0-9]+-odoo-prod', bucket_name))
if environment_name == 'prod':
assert prod_bucket, (
"AWS_BUCKETNAME should match '<client>-odoo-prod', "
Expand All @@ -200,10 +217,10 @@ def _check_s3(self, cr, uid, environment_name, context=None):
)

def _check_redis(self, cr, uid, environment_name, context=None):
if environment_name in ('prod', 'integration', 'test'):
if environment_name in ('prod', 'integration', 'labs', 'test'):
assert is_true(os.environ.get('ODOO_SESSION_REDIS')), (
"Redis must be activated on prod, integration, test instances."
"This is done by setting ODOO_SESSION_REDIS=1."
"Redis must be activated on prod, integration, labs,"
" test instances. This is done by setting ODOO_SESSION_REDIS=1."
)
assert (os.environ.get('ODOO_SESSION_REDIS_HOST') or
os.environ.get('ODOO_SESSION_REDIS_SENTINEL_HOST')), (
Expand All @@ -216,7 +233,7 @@ def _check_redis(self, cr, uid, environment_name, context=None):
)

prefix = os.environ['ODOO_SESSION_REDIS_PREFIX']
assert re.match(r'[a-z0-9_-]+-odoo-[a-z]+', prefix), (
assert re.match(r'^[a-z-0-9]+-odoo-[a-z-0-9]+$', prefix), (
"ODOO_SESSION_REDIS_PREFIX must match '<client>-odoo-<env>'"
", we got: '%s'" % (prefix,)
)
Expand All @@ -236,7 +253,7 @@ def check(self, cr, uid, context=None):
"probably run 'env['cloud.platform'].install_exoscale()'"
)
return
environment_name = config['running_env']
environment_name = self._get_running_env()
if kind == 'exoscale':
self._check_s3(cr, uid, environment_name, context)
elif kind == 'ovh':
Expand Down
1 change: 1 addition & 0 deletions cloud_platform_ovh/models/cloud_platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def _config_by_server_env_for_ovh(self):
configs = {
'prod': PlatformConfig(filestore=FilestoreKind.swift),
'integration': PlatformConfig(filestore=FilestoreKind.swift),
'labs': PlatformConfig(filestore=FilestoreKind.swift),
'test': PlatformConfig(filestore=FilestoreKind.db),
'dev': PlatformConfig(filestore=FilestoreKind.db),
}
Expand Down

0 comments on commit bf35de5

Please sign in to comment.