Skip to content

Commit 86b7c9b

Browse files
authored
chore: Unify internal service host config names (#269)
1 parent 229a270 commit 86b7c9b

14 files changed

Lines changed: 90 additions & 216 deletions

openshift/template.yaml

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,8 @@ objects:
2626
- command:
2727
- /bin/entrypoint.sh
2828
env:
29-
- name: BAYESIAN_GREMLIN_HTTP_SERVICE_HOST
30-
value: bayesian-gremlin-http
31-
- name: BAYESIAN_GREMLIN_HTTP_SERVICE_PORT
32-
value: "8182"
29+
- name: GREMLIN_URL
30+
value: "http://bayesian-gremlin-http:8182"
3331
- name: DEPLOYMENT_PREFIX
3432
valueFrom:
3533
configMapKeyRef:
@@ -46,22 +44,14 @@ objects:
4644
value: bayesian-pgbouncer
4745
- name: PGBOUNCER_SERVICE_PORT
4846
value: "5432"
49-
- name: LICENSE_SERVICE_HOST
50-
value: f8a-license-analysis
51-
- name: LICENSE_SERVICE_PORT
52-
value: "6162"
53-
- name: CHESTER_SERVICE_HOST
54-
value: f8a-npm-insights
55-
- name: PYPI_SERVICE_HOST
56-
value: f8a-pypi-insights
57-
- name: GOLANG_SERVICE_HOST
58-
value: f8a-golang-insights
59-
- name: MAVEN_SERVICE_HOST
60-
value: f8a-hpf-insights-maven
61-
- name: HPF_SERVICE_HOST
62-
value: f8a-hpf-insights
63-
- name: SERVICE_PORT
64-
value: "6006"
47+
- name: LICENSE_ANALYSIS_BASE_URL
48+
value: "http://f8a-license-analysis:6162"
49+
- name: NPM_INSIGHTS_BASE_URL
50+
value: "http://f8a-npm-insights:6006"
51+
- name: PYPI_INSIGHTS_BASE_URL
52+
value: "http://f8a-pypi-insights:6006"
53+
- name: MAVEN_INSIGHTS_BASE_URL
54+
value: "http://f8a-hpf-insights-maven:6006"
6555
- name: POSTGRESQL_DATABASE
6656
valueFrom:
6757
secretKeyRef:

src/recommender.py

Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@
7070
import re
7171
import logging
7272

73+
from pydantic import AnyHttpUrl
74+
75+
from src.settings import AGGREGATOR_SETTINGS, RECOMMENDER_SETTINGS, SETTINGS
7376
from src.utils import (create_package_dict, get_session_retry, select_latest_version,
74-
GREMLIN_SERVER_URL_REST, LICENSE_SCORING_URL_REST,
7577
convert_version_to_proper_semantic, get_response_data,
7678
version_info_tuple, persist_data_in_db, post_http_request)
7779
from src.stack_aggregator import extract_user_stack_package_licenses
@@ -112,7 +114,7 @@ def get_version_information(input_list, ecosystem):
112114
}
113115

114116
# Query Gremlin with packages list to get their version information
115-
gremlin_response = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
117+
gremlin_response = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
116118
if gremlin_response is None:
117119
return []
118120
response = get_response_data(gremlin_response, [{0: 0}])
@@ -289,7 +291,7 @@ class License:
289291
@staticmethod
290292
def invoke_license_analysis_service(user_stack_packages, alt_packages, comp_packages):
291293
"""Pass given args to stack_license analysis."""
292-
license_url = LICENSE_SCORING_URL_REST + "/api/v1/stack_license"
294+
license_url = AGGREGATOR_SETTINGS.license_analysis_base_url + "/api/v1/stack_license"
293295

294296
payload = {
295297
"packages": user_stack_packages,
@@ -413,41 +415,20 @@ def set_valid_cooccurrence_probability(package_list=[]):
413415
return new_package_list
414416

415417

416-
class RecommendationTask:
417-
"""Recommendation task."""
418+
def _prepare_insights_url(base_url: AnyHttpUrl) -> AnyHttpUrl:
419+
assert base_url
420+
return "{url}/api/v1/companion_recommendation".format(url=base_url)
418421

419-
_analysis_name = 'recommendation_v2'
420-
description = 'Get Recommendation'
421-
kronos_ecosystems = ['maven']
422-
chester_ecosystems = ['npm']
423-
hpf_ecosystems = ['maven']
424-
pypi_ecosystems = ['pypi']
425-
golang_ecosystem = ['golang']
426422

427-
@staticmethod
428-
def get_insights_url(payload):
429-
"""Get the insights url based on the ecosystem."""
430-
if payload and 'ecosystem' in payload[0]:
431-
if payload[0]['ecosystem'] in RecommendationTask.chester_ecosystems:
432-
INSIGHTS_SERVICE_HOST = os.getenv("CHESTER_SERVICE_HOST")
433-
elif payload[0]['ecosystem'] in RecommendationTask.pypi_ecosystems:
434-
INSIGHTS_SERVICE_HOST = os.getenv("PYPI_SERVICE_HOST")
435-
elif payload[0]['ecosystem'] in RecommendationTask.golang_ecosystem:
436-
INSIGHTS_SERVICE_HOST = os.environ.get("GOLANG_SERVICE_HOST")
437-
else:
438-
INSIGHTS_SERVICE_HOST = os.getenv("HPF_SERVICE_HOST") + "-" + payload[0][
439-
'ecosystem']
423+
ECOSYSTEM_TO_INSIGHTS_URL = {
424+
"pypi": _prepare_insights_url(RECOMMENDER_SETTINGS.pypi_insights_base_url),
425+
"npm": _prepare_insights_url(RECOMMENDER_SETTINGS.npm_insights_base_url),
426+
"maven": _prepare_insights_url(RECOMMENDER_SETTINGS.maven_insights_base_url),
427+
}
440428

441-
INSIGHTS_URL_REST = "http://{host}:{port}".format(host=INSIGHTS_SERVICE_HOST,
442-
port=os.getenv("SERVICE_PORT"))
443429

444-
insights_url = INSIGHTS_URL_REST + "/api/v1/companion_recommendation"
445-
446-
return insights_url
447-
448-
else:
449-
logger.error('Payload information not passed in the call, Quitting! inights '
450-
'recommender\'s call')
430+
class RecommendationTask:
431+
"""Recommendation task."""
451432

452433
@staticmethod
453434
def call_insights_recommender(payload):
@@ -459,7 +440,8 @@ def call_insights_recommender(payload):
459440
try:
460441
# TODO remove hardcodedness for payloads with multiple ecosystems
461442

462-
insights_url = RecommendationTask.get_insights_url(payload)
443+
insights_url = ECOSYSTEM_TO_INSIGHTS_URL.get(payload[0]['ecosystem'], None)
444+
assert insights_url
463445
response = get_session_retry().post(insights_url, json=payload)
464446

465447
if response.status_code != 200:
@@ -519,13 +501,6 @@ def execute(self, arguments=None, persist=True, check_license=False):
519501
'comp_package_count_threshold': int(os.environ.get(
520502
'MAX_COMPANION_PACKAGES', 5))
521503
}
522-
if details['ecosystem'] in self.kronos_ecosystems:
523-
insights_payload.update({
524-
'alt_package_count_threshold': int(os.environ.get('MAX_ALTERNATE_PACKAGES', 2)),
525-
'outlier_probability_threshold': float(os.environ.get('OUTLIER_THRESHOLD',
526-
0.6)),
527-
'user_persona': "1", # TODO - remove janus hardcoded value
528-
})
529504
input_task_for_insights_recommender = [insights_payload]
530505

531506
# Call PGM and get the response

src/rest_api.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _recommender(handler):
5454

5555
input_json = request.get_json()
5656
external_request_id = input_json['external_request_id']
57-
logger.info('%s recommender/ request with payload: %s', external_request_id, input_json)
57+
logger.info('%s recommender/ request', external_request_id)
5858

5959
try:
6060
check_license = request.args.get('check_license', 'false') == 'true'
@@ -96,8 +96,7 @@ def _stack_aggregator(handler):
9696
}
9797

9898
external_request_id = input_json['external_request_id']
99-
logger.info('%s stack_aggregator/ request with payload: %s',
100-
external_request_id, input_json)
99+
logger.info('%s stack_aggregator/ request', external_request_id)
101100

102101
try:
103102
persist = request.args.get('persist', 'true') == 'true'

src/settings.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,34 @@
22

33

44
from typing import Dict
5-
from pydantic import BaseSettings, HttpUrl
5+
from pydantic import BaseSettings, HttpUrl, AnyHttpUrl
66

77

88
class AggregatorSettings(BaseSettings):
99
"""Create Settings from env."""
1010

11-
snyk_package_url_format: HttpUrl = "https://snyk.io/vuln/{ecosystem}:{package}"
11+
license_analysis_base_url: AnyHttpUrl = "http://f8a-license-analysis:6162"
1212
snyk_signin_url: HttpUrl = "https://snyk.io/login"
13+
snyk_package_url_format: HttpUrl = "https://snyk.io/vuln/{ecosystem}:{package}"
1314
snyk_ecosystem_map: Dict[str, str] = {"pypi": "pip"}
14-
disable_unknown_package_flow: bool = False
1515

1616

1717
class RecommenderSettings(BaseSettings):
1818
"""Create Recommender Settings from env."""
1919

20-
chester_service_host: str = "notset"
21-
pypi_service_host: str = "notset"
22-
maven_service_host: str = "notset"
23-
service_port: int = 6006
20+
npm_insights_base_url: AnyHttpUrl = "http://f8a-npm-insights:6006"
21+
pypi_insights_base_url: AnyHttpUrl = "http://f8a-pypi-insights:6006"
22+
maven_insights_base_url: AnyHttpUrl = "http://f8a-hpf-insights-maven:6006"
2423
unknown_packages_threshold: float = 0.3
2524
max_companion_packages: int = 5
25+
26+
27+
class Settings(BaseSettings):
28+
"""General settings."""
29+
30+
gremlin_url: AnyHttpUrl = "http://bayesian-gremlin-http:8182"
31+
32+
33+
SETTINGS = Settings()
34+
RECOMMENDER_SETTINGS = RecommenderSettings()
35+
AGGREGATOR_SETTINGS = AggregatorSettings()

src/stack_aggregator.py

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
import requests
1313
import copy
1414
from collections import defaultdict
15-
from src.settings import AggregatorSettings
16-
from src.utils import (select_latest_version, server_create_analysis, LICENSE_SCORING_URL_REST,
17-
post_http_request, GREMLIN_SERVER_URL_REST, persist_data_in_db,
15+
from src.settings import AGGREGATOR_SETTINGS, SETTINGS
16+
from src.utils import (select_latest_version, server_create_analysis,
17+
post_http_request, persist_data_in_db,
1818
GREMLIN_QUERY_SIZE, format_date)
1919
import logging
2020

@@ -27,7 +27,7 @@ def get_recommended_version(ecosystem, name, version):
2727
".out('has_version').not(out('has_cve')).values('version');"\
2828
.format(eco=ecosystem, pkg=name)
2929
payload = {'gremlin': query}
30-
result = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
30+
result = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
3131
if result:
3232
versions = result['result']['data']
3333
if len(versions) == 0:
@@ -269,7 +269,7 @@ def _extract_license_outliers(license_service_output):
269269

270270
def perform_license_analysis(license_score_list, dependencies):
271271
"""Pass given license_score_list to stack_license analysis and process response."""
272-
license_url = LICENSE_SCORING_URL_REST + "/api/v1/stack_license"
272+
license_url = AGGREGATOR_SETTINGS.license_analysis_base_url + "/api/v1/stack_license"
273273

274274
payload = {
275275
"packages": license_score_list
@@ -510,7 +510,7 @@ def get_tr_dependency_data(epv_set):
510510
i = 1
511511
# call_gremlin in batch
512512
payload = {'gremlin': query}
513-
result = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
513+
result = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
514514
if result:
515515
tr_epv_list['result']['data'] += result['result']['data']
516516
query = "epv=[];"
@@ -519,7 +519,7 @@ def get_tr_dependency_data(epv_set):
519519
if i > 1:
520520
payload = {'gremlin': query}
521521
time_start = time.time()
522-
result = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
522+
result = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
523523
logger.info('elapsed_time for gremlin call: {}'.format(time.time() - time_start))
524524
if result:
525525
tr_epv_list['result']['data'] += result['result']['data']
@@ -571,15 +571,15 @@ def get_dependency_data(epv_set):
571571
i = 1
572572
# call_gremlin in batch
573573
payload = {'gremlin': query}
574-
result = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
574+
result = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
575575
if result:
576576
epv_list['result']['data'] += result['result']['data']
577577
query = "epv=[];"
578578
i += 1
579579

580580
if i > 1:
581581
payload = {'gremlin': query}
582-
result = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
582+
result = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
583583
if result:
584584
epv_list['result']['data'] += result['result']['data']
585585

@@ -663,16 +663,13 @@ def execute(aggregated=None, persist=True):
663663
'result': stack_data}
664664
# Ingestion of Unknown dependencies
665665
logger.info("Unknown ingestion flow process initiated.")
666-
if AggregatorSettings().disable_unknown_package_flow:
667-
logger.warning('Skipping unknown flow %s', unknown_dep_list)
668-
else:
669-
try:
670-
for dep in unknown_dep_list:
671-
server_create_analysis(ecosystem, dep['name'], dep['version'], api_flow=True,
672-
force=False, force_graph_sync=True)
673-
except Exception as e:
674-
logger.error('Ingestion has been failed for ' + dep['name'])
675-
logger.error(e)
676-
pass
666+
try:
667+
for dep in unknown_dep_list:
668+
server_create_analysis(ecosystem, dep['name'], dep['version'], api_flow=True,
669+
force=False, force_graph_sync=True)
670+
except Exception as e:
671+
logger.error('Ingestion has been failed for ' + dep['name'])
672+
logger.error(e)
673+
pass
677674

678675
return persiststatus

src/utils.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
from sqlalchemy.exc import SQLAlchemyError
2323
from sqlalchemy.orm import sessionmaker
2424

25+
from src.settings import SETTINGS
26+
2527

2628
logger = logging.getLogger(__name__)
2729

@@ -39,13 +41,6 @@ class RequestException(Exception):
3941

4042

4143
logger = logging.getLogger(__file__)
42-
GREMLIN_SERVER_URL_REST = "http://{host}:{port}".format(
43-
host=os.environ.get("BAYESIAN_GREMLIN_HTTP_SERVICE_HOST", "localhost"),
44-
port=os.environ.get("BAYESIAN_GREMLIN_HTTP_SERVICE_PORT", "8182"))
45-
46-
LICENSE_SCORING_URL_REST = "http://{host}:{port}".format(
47-
host=os.environ.get("LICENSE_SERVICE_HOST", "localhost"),
48-
port=os.environ.get("LICENSE_SERVICE_PORT", "6162"))
4944

5045
zero_version = sv.Version("0.0.0")
5146
# Create Postgres Connection Session
@@ -104,7 +99,7 @@ def get_osio_user_count(ecosystem, name, version):
10499
'gremlin': str_gremlin
105100
}
106101

107-
json_response = post_http_request(url=GREMLIN_SERVER_URL_REST, payload=payload)
102+
json_response = post_http_request(url=SETTINGS.gremlin_url, payload=payload)
108103
return json_response.get('result').get('data', ['-1'])[0]
109104

110105

@@ -330,7 +325,7 @@ def post_gremlin(query: str, bindings: Dict = None) -> Dict:
330325
if bindings:
331326
payload['bindings'] = bindings
332327
try:
333-
response = get_session_retry().post(url=GREMLIN_SERVER_URL_REST, json=payload)
328+
response = get_session_retry().post(url=SETTINGS.gremlin_url, json=payload)
334329
response.raise_for_status()
335330
except Exception as e:
336331
logger.error(traceback.format_exc())

src/v2/license_service.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import logging
44
from typing import List, Set
55

6-
from src.utils import LICENSE_SCORING_URL_REST, post_http_request
6+
from src.utils import post_http_request
7+
from src.settings import AGGREGATOR_SETTINGS
78
from src.v2.models import LicenseAnalysis, PackageDetails
89

910

@@ -158,7 +159,7 @@ def get_license_service_request_payload(package_details: List[PackageDetails]):
158159
def get_license_analysis_for_stack(
159160
package_details: List[PackageDetails]) -> LicenseAnalysis: # pylint:disable=R0914
160161
"""Create LicenseAnalysis from license server."""
161-
license_url = LICENSE_SCORING_URL_REST + "/api/v1/stack_license"
162+
license_url = AGGREGATOR_SETTINGS.license_analysis_base_url + "/api/v1/stack_license"
162163

163164
# form payload for license service request
164165
payload = {

0 commit comments

Comments
 (0)