示例#1
0
def test_is_cgap_env():

    assert is_cgap_env(None) is False

    assert is_cgap_env('fourfront-cgap') is True
    assert is_cgap_env('cgap-prod') is True
    assert is_cgap_env('fourfront-blue') is False
示例#2
0
def infer_repo_from_env(event):
    source_env = event['source_env']
    dest_env = event['dest_env']
    if is_cgap_env(source_env) and is_cgap_env(dest_env):
        return 'cgap-portal'
    elif is_cgap_env(source_env) and is_cgap_env(dest_env):
        return 'fourfront'
    else:
        raise InconsistentEnvironments(source_env=source_env,
                                       dest_env=dest_env)
示例#3
0
 def mocked_standard_mirror_env(envname):
     assert envname.endswith(
         "-prd-env"
     ), "mocked_standard_mirror_env does nto handle %r." % envname
     if env_utils.is_fourfront_env(envname):
         return "fourfront-stg-env"
     elif env_utils.is_cgap_env(envname):
         return None
     else:
         raise AssertionError(
             "mocked_standard_mirror_env does not handle %r." % envname)
示例#4
0
def test_compute_prd_env_for_env():

    computed_ff_prd = compute_prd_env_for_env('fourfront-mastertest')
    assert is_fourfront_env(computed_ff_prd)
    assert is_stg_or_prd_env(computed_ff_prd)

    computed_cgap_prd = compute_prd_env_for_env('fourfront-cgapwolf')
    assert is_cgap_env(computed_cgap_prd)
    assert is_stg_or_prd_env(computed_cgap_prd)

    with pytest.raises(NotBeanstalkEnvironment):
        compute_prd_env_for_env('fourfront-production-blue')
示例#5
0
def provision_indexer_environment(connection, **kwargs):
    """ Provisions an indexer environment for the given env. Note that only one indexer can be online
        per application (one for 4DN, one for CGAP).

        IMPORTANT: env is an EB ENV NAME ('data', 'staging' are NOT valid).
        IMPORTANT: This ecosystem will break some integrated tests in dcicutils
    """
    check = CheckResult(connection, 'provision_indexer_environment')
    env = kwargs.get('env', None)
    application_version = kwargs.get('application_version', None)

    if application_version is None:
        check.status = 'ERROR'
        check.summary = 'Did not provide application_version to deploy indexer, which is required. ' \
                        'Get this information from the EB Console.'
        return check

    def _deploy_indexer(e, version):
        if is_fourfront_env(e):
            description = try_to_describe_indexer_env(FF_ENV_INDEXER)
        else:
            description = try_to_describe_indexer_env(CGAP_ENV_INDEXER)
        if description is not None:
            check.status = 'ERROR'
            check.summary = 'Tried to spin up indexer env for %s when one already exists for this portal' % e
            return False
        else:
            return EBDeployer.deploy_indexer(e, version)

    if is_cgap_env(env) or is_fourfront_env(env):
        success = _deploy_indexer(env, application_version)
        if success:
            check.status = 'PASS'
            check.summary = 'Successfully triggered indexer-server provision for environment %s' % env
        else:
            check.status = 'ERROR'
            check.summary = 'An error occurred on deployment. Check the AWS EB Console.'
    else:
        check.status = 'FAIL'
        check.summary = 'Gave an unknown environment: %s' % env

    return check
示例#6
0
def convert_to_html(data, environment):
    if is_cgap_env(environment):
        logo_url = CGAP_LOGO_URL
        logo_url_alt = "CGAP helix logo"
        page_name = "CGAP Status"
    else:
        logo_url = FF_LOGO_URL
        logo_url_alt = "4DN sphere logo"
        page_name = "Fourfront Status"

    message = data.get("message")
    calendar_events = data.get('calendar')
    if not calendar_events and not message:
        # When there's no error message to shown, supply a default event if nothing else to show.
        calendar_events = [NULL_EVENT]
    priority = data.get('priority') or DEFAULT_PRIORITY
    event_str = io.StringIO()
    sections_used = []
    for i, event in enumerate(calendar_events, start=1):
        # print("calendar_event=", calendar_event, "i=", i)
        event_name = event.get('name') or "Event %s" % i
        affects = event.get('affects') or {}
        affects_name = affects.get('name') or ""
        # affects_envs = affects.get('environments') or []
        section = io.StringIO()
        section.write('<dt class="calendar-event">%s</dt>\n' %
                      html.escape(event_name))
        section.write("<dd>\n")
        section.write('<p><span class="who">%s</span>' %
                      html.escape(affects_name))
        section.write(
            ' <span class="when">(%s to %s)</span></p>\n' %
            (html.escape(event.get('start_time') or "now"),
             html.escape(event.get('end_time') or "the foreseeable future")))
        section.write(
            '<p class="what">%s</p>\n' %
            (html.escape(event.get("description") or "To Be Determined")))
        section.write("</dt>\n")
        event_str.write(section.getvalue())
        sections_used.append(i)
    event_body = event_str.getvalue()
    message = '<div class="message bgcolor_orange"><p>NOTE: ' + html.escape(
        message) + '</p></div>' if message else ''
    substitutions = {
        'PRIORITY': priority,
        'LOGO_URL': logo_url,
        'LOGO_URL_ALT': logo_url_alt,
        'PAGE_NAME': page_name,
        'EVENT_BODY': event_body,
        'MESSAGE': message,
    }
    body = '''
<!DOCTYPE html>
<html>
 <head>
  <title>4DN Status</title>
   <meta name="robots" content="noindex, nofollow" />
   <style><!--
   .bgcolor_red {background: #ffdddd}
   .bgcolor_orange {background: #ffeedd}
   .bgcolor_yellow {background: #ffffdd}
   .bgcolor_green {background: #ddffdd}
   .banner {padding-left: 30pt; padding-bottom: 10pt; padding-top: 10pt;}
   .page-name {padding-left: 10pt; font-size: 30pt;}
   .logo {height: 100%; vertical-align: middle; height: 36pt;}
   .calendar {padding-left: 30pt;}
   .calendar-event {font-size: 20pt;}
   .who {font-weight: bold; font-size: 16pt;}
   .when {font-weight: bold; font-size: 14pt;}
   .what {font-size: 12pt;}
   div.message {margin-top: 5pt; padding-left: 30pt; border: 1pt red solid; width: 500pt;}
   div.message p {font-weight: bold;}
  --></style>
 </head>
 <body>
  <div class="banner bgcolor_<<PRIORITY>>" id="banner">
   <table>
    <tr>
     <td valign="middle">
      <img src="<<LOGO_URL>>" class="logo" alt="<<LOGO_URL_ALT>>" />
     </td>
     <td class="page-name" valign="bottom"><<PAGE_NAME>></td>
    </tr>
   </table>
  </div>
  <<MESSAGE>>
  <dl class="calendar">
   <<EVENT_BODY>>
  </dl>
 </body>
</html>'''
    for name, val in substitutions.items():
        body = body.replace('<<' + name + '>>', val)
    return body
示例#7
0
def test_magic_cnames_by_cname_consistency():

    # These tests are highly specific and will have to change if we make something else be magic.
    # But such is magic. The values should not be casually changed, and such overhead is appropriate.
    # It's good to have tests that will catch unwanted tinkering, typos, etc.

    ff_magic_envs = [FF_ENV_PRODUCTION_GREEN, FF_ENV_PRODUCTION_BLUE]
    cgap_magic_envs = [CGAP_ENV_WEBPROD]

    assert ff_magic_envs == ['fourfront-green', 'fourfront-blue']
    assert cgap_magic_envs == ['fourfront-cgap']

    client = boto3.client('elasticbeanstalk', region_name=base.REGION)
    res = base.describe_beanstalk_environments(client,
                                               ApplicationName='4dn-web')
    envs = res['Environments']
    roles = defaultdict(lambda: [])
    for env in envs:
        env_name = env.get('EnvironmentName')
        cname = env.get('CNAME')
        ip = socket.gethostbyname(cname)
        note = ""
        if cname == base._FF_MAGIC_CNAME:
            assert env_name in ff_magic_envs
            ff_prod = "data.4dnucleome.org"
            ff_prod_ips = _ip_addresses(ff_prod)
            assert _ip_addresses(cname) == ff_prod_ips
            note = "\n => FF PRODUCTION (%s @ %s)" % (ff_prod,
                                                      ",".join(ff_prod_ips))
            roles['FF_PRODUCTION'].append(env_name)
            assert env_utils.is_stg_or_prd_env(env_name)
        elif cname == base._CGAP_MAGIC_CNAME:
            assert env_name in cgap_magic_envs
            cgap_prod = "cgap.hms.harvard.edu"
            cgap_prod_ips = _ip_addresses(cgap_prod)
            assert _ip_addresses(cname) == cgap_prod_ips
            note = "\n => CGAP PRODUCTION (%s @ %s)" % (
                cgap_prod, ",".join(cgap_prod_ips))
            roles['CGAP_PRODUCTION'].append(env_name)
            assert env_utils.is_stg_or_prd_env(env_name)
        elif env_utils.is_stg_or_prd_env(env_name):
            if env_utils.is_cgap_env(env_name):
                note = "\n => CGAP STAGING ???"  # An error about this is reported later
                roles['CGAP_STAGING'].append(env_name)
                assert env_utils.is_stg_or_prd_env(env_name)
            else:
                ff_staging = "staging.4dnucleome.org"
                ff_staging_ips = _ip_addresses(ff_staging)
                assert _ip_addresses(cname) == ff_staging_ips
                note = "\n => FF STAGING (%s @ %s)" % (
                    ff_staging, ",".join(ff_staging_ips))
                roles['FF_STAGING'].append(env_name)
                assert env_utils.is_stg_or_prd_env(env_name)
        print("%s (%s) = %s %s" % (env_name, ip, cname, note))
    print("roles =", json.dumps(roles, indent=2))
    assert len(roles['FF_PRODUCTION']) == 1
    assert len(roles['FF_STAGING']) == 1
    assert len(roles['CGAP_PRODUCTION']) == 1
    assert len(roles['CGAP_STAGING']
               ) == 0  # CGAP does not expect to have a production mirror
    assert env_utils.get_standard_mirror_env(
        roles['FF_PRODUCTION'][0]) == roles['FF_STAGING'][0]
    assert env_utils.get_standard_mirror_env(
        roles['FF_STAGING'][0]) == roles['FF_PRODUCTION'][0]