Skip to content

Commit

Permalink
Use project identifier env variable to specify where ert storage conn…
Browse files Browse the repository at this point in the history
…ection info is located

Generate temp webviz config by adding project identifier to all plugins defined in WEBVIZ_CONFIG
  • Loading branch information
ManInFez committed Dec 9, 2020
1 parent 27d0163 commit ee6da48
Show file tree
Hide file tree
Showing 15 changed files with 84 additions and 38 deletions.
3 changes: 0 additions & 3 deletions ertviz/assets/webviz-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,12 @@ pages:

- title: Front page
content:
- Welcome to Webviz-ERT
- EnsembleOverview:

- title: Comparison Viewer
content:
- Ensemble Comparison
- EnsembleComparison:

- title: Response Comparison Viewer
content:
- Response Comparison
- ResponseComparison:
6 changes: 4 additions & 2 deletions ertviz/controllers/ensemble_selector_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,13 @@ def update_ensemble_selector(query, selected_ensembles, elements):
selected_ensembles.get(element["data"]["id"], {})
)
else:
ensemble_dict = get_ensembles()
ensemble_dict = get_ensembles(project_id=parent.project_identifier)
for ensemble_schema in ensemble_dict:
ensemble_id = ensemble_schema["ref_url"]
if ensemble_id not in parent.ensembles:
parent.ensembles[ensemble_id] = EnsembleModel(ref_url=ensemble_id)
parent.ensembles[ensemble_id] = EnsembleModel(
ref_url=ensemble_id, project_id=parent.project_identifier
)
datas = _construct_graph(parent.ensembles)
return datas

Expand Down
5 changes: 4 additions & 1 deletion ertviz/controllers/multi_parameter_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ def update_parameter_options(selected_ensembles):
if not selected_ensembles:
raise PreventUpdate
ensemble_id, _ = selected_ensembles.popitem()
ensemble = parent.ensembles.get(ensemble_id, EnsembleModel(ref_url=ensemble_id))
ensemble = parent.ensembles.get(
ensemble_id,
EnsembleModel(ref_url=ensemble_id, project_id=parent.project_identifier),
)
parent.ensembles[ensemble_id] = ensemble
parent.parameter_models[ensemble_id] = ensemble.parameters
options = [
Expand Down
5 changes: 4 additions & 1 deletion ertviz/controllers/multi_response_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ def _set_response_options(selected_ensembles, selectors):
if not selected_ensembles:
raise PreventUpdate
ensemble_id, _ = selected_ensembles.popitem()
ensemble = parent.ensembles.get(ensemble_id, EnsembleModel(ref_url=ensemble_id))
ensemble = parent.ensembles.get(
ensemble_id,
EnsembleModel(ref_url=ensemble_id, project_id=parent.project_identifier),
)
parent.ensembles[ensemble_id] = ensemble
return [
[
Expand Down
32 changes: 17 additions & 15 deletions ertviz/data_loader/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,46 @@
import pandas


def get_info():
def get_info(project_id=None):
from ert_shared.storage.connection import get_info

return get_info()
return get_info(project_id)


os.environ["NO_PROXY"] = "localhost,127.0.0.1"
data_cache = {}


def get_url():
return get_info()["baseurl"]
def get_url(project_id=None):
return get_info(project_id)["baseurl"]


def get_auth():
return get_info()["auth"]
def get_auth(project_id=None):
return get_info(project_id)["auth"]


def get_csv_data(data_url):
response = requests.get(data_url, auth=get_auth(), stream=True)
def get_csv_data(data_url, project_id=None):
response = requests.get(data_url, auth=get_auth(project_id), stream=True)
return pandas.read_csv(response.raw, names=["value"])


def get_ensembles():
server_url = get_url()
data_cache["ensembles"] = get_schema(f"{server_url}/ensembles")["ensembles"]
def get_ensembles(project_id=None):
server_url = get_url(project_id)
data_cache["ensembles"] = get_schema(f"{server_url}/ensembles", project_id)[
"ensembles"
]
return data_cache["ensembles"]


def get_ensemble_url(ensemble_id):
server_url = get_url()
def get_ensemble_url(ensemble_id, project_id=None):
server_url = get_url(project_id)
url = f"{server_url}/ensembles/{ensemble_id}"
return url


def get_schema(api_url):
def get_schema(api_url, project_id=None):
logging.info(f"Getting json from {api_url}...")
http_response = requests.get(api_url, auth=get_auth())
http_response = requests.get(api_url, auth=get_auth(project_id))
http_response.raise_for_status()

logging.info(" done!")
Expand Down
23 changes: 22 additions & 1 deletion ertviz/ert_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import sys
import os
import logging
import tempfile
import yaml
from ert_shared.plugins.plugin_manager import hook_implementation
from ertviz.assets import WEBVIZ_CONFIG

Expand All @@ -20,6 +22,18 @@ def handle_exit(*args): # pylint: disable=unused-argument)
sys.exit()


def create_config(project_identifier, config_file, temp_config):
with open(config_file, "r") as f:
config_dict = yaml.safe_load(f)
for page in config_dict["pages"]:
for element in page["content"]:
for key in element:
element[key] = {"project_identifier": project_identifier}
output_str = yaml.dump(config_dict)
temp_config.write(str.encode(output_str))
temp_config.seek(0)


class WebvizErtPlugin:
name = "Webviz-ERT"

Expand All @@ -28,7 +42,14 @@ def run():
signal.signal(signal.SIGINT, handle_exit)
# The entry point of webviz is to call it from command line, and so do we.
if shutil.which("webviz"):
subprocess.run(["webviz", "build", WEBVIZ_CONFIG, "--theme", "equinor"])
with tempfile.NamedTemporaryFile() as temp_config:
project_identifier = os.getenv("ERT_PROJECT_IDENTIFIER")
if project_identifier is None:
logger.error("Unable to find ERT project!")
create_config(project_identifier, WEBVIZ_CONFIG, temp_config)
subprocess.run(
["webviz", "build", temp_config.name, "--theme", "equinor"]
)
else:
logger.error("Failed to find webviz")

Expand Down
22 changes: 16 additions & 6 deletions ertviz/models/ensemble_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
)


def get_parameter_models(parameters_schema):
def get_parameter_models(parameters_schema, project_id):
parameters = {}
for param in parameters_schema:
group = param["group"]
Expand All @@ -20,14 +20,19 @@ def get_parameter_models(parameters_schema):
param["prior"]["parameter_values"],
)
parameters[key] = ParametersModel(
group=group, key=key, prior=prior, schema_url=param["ref_url"]
group=group,
key=key,
prior=prior,
schema_url=param["ref_url"],
project_id=project_id,
)
return parameters


class EnsembleModel:
def __init__(self, ref_url):
def __init__(self, ref_url, project_id):
self._schema = get_schema(api_url=ref_url)
self._project_id = project_id
self._name = self._schema["name"]
self._id = ref_url
self._children = self._schema["children"]
Expand All @@ -46,7 +51,8 @@ def children(self):
if hasattr(self, "_cached_children"):
return self._cached_children
self._cached_children = [
EnsembleModel(ref_url=child["ref_url"]) for child in self._children
EnsembleModel(ref_url=child["ref_url"], project_id=self._project_id)
for child in self._children
]
return self._cached_children

Expand All @@ -57,13 +63,17 @@ def parent(self):
if hasattr(self, "_cached_parent"):
return self._cached_parent

self._cached_parent = EnsembleModel(ref_url=self._parent["ref_url"])
self._cached_parent = EnsembleModel(
ref_url=self._parent["ref_url"], project_id=self._project_id
)
return self._cached_parent

@property
def parameters(self):
if self._parameters is None:
self._parameters = get_parameter_models(self._schema["parameters"])
self._parameters = get_parameter_models(
self._schema["parameters"], project_id=self._project_id
)
return self._parameters

@property
Expand Down
6 changes: 5 additions & 1 deletion ertviz/models/parameter_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@

class PriorModel:
def __init__(self, function, function_parameter_names, function_parameter_values):

self.function = function
self.function_parameter_names = function_parameter_names
self.function_parameter_values = function_parameter_values


class ParametersModel:
def __init__(self, **kwargs):
self._project_id = kwargs["project_id"]
self.group = kwargs["group"]
self.key = kwargs["key"]
self.priors = kwargs["prior"]
Expand All @@ -20,7 +22,9 @@ def __init__(self, **kwargs):
def data_df(self):
if self._data_df is None:
realizations_schema = get_schema(self._schema_url)
self._data_df = get_csv_data(realizations_schema["alldata_url"]).T
self._data_df = get_csv_data(
realizations_schema["alldata_url"], project_id=self._project_id
).T
self._data_df.columns = [
schema["name"]
for schema in realizations_schema["parameter_realizations"]
Expand Down
3 changes: 2 additions & 1 deletion ertviz/plugins/_ensemble_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@


class EnsembleComparison(WebvizPluginABC):
def __init__(self, app):
def __init__(self, app, project_identifier: str):
super().__init__()
self.project_identifier = project_identifier
self.ensembles = {}
self.parameter_models = {}
self.set_callbacks(app)
Expand Down
3 changes: 2 additions & 1 deletion ertviz/plugins/_ensemble_overview.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@


class EnsembleOverview(WebvizPluginABC):
def __init__(self, app):
def __init__(self, app, project_identifier: str):
super().__init__()
self.project_identifier = project_identifier
self.ensembles = {}
self.set_callbacks(app)

Expand Down
3 changes: 2 additions & 1 deletion ertviz/plugins/_response_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@


class ResponseComparison(WebvizPluginABC):
def __init__(self, app):
def __init__(self, app, project_identifier: str):
super().__init__()
self.project_identifier = project_identifier
self.ensembles = {}
self.parameter_models = {}
self.set_callbacks(app)
Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def pytest_setup_options():
return options


def mocked_get_info():
def mocked_get_info(project_id):
return {"baseurl": "http://127.0.0.1:5000", "auth": ""}


Expand Down
2 changes: 1 addition & 1 deletion tests/models/test_ensemble_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@mock.patch("ertviz.data_loader.pandas.read_csv", side_effect=mocked_read_csv)
@mock.patch("ertviz.data_loader.get_info", side_effect=mocked_get_info)
def test_ensemble_model(mock_get, mock_get_csv, mock_get_info):
ens_model = EnsembleModel(get_ensemble_url("1"))
ens_model = EnsembleModel(get_ensemble_url("1"), project_id=None)
assert len(ens_model.children) == 1
assert ens_model.children[0]._name == "default_smoother_update"
assert ens_model._name == "default"
Expand Down
5 changes: 3 additions & 2 deletions tests/plots/test_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,10 @@ def test_realizations_statistics_plot_representation():
@mock.patch("ertviz.data_loader.requests.get", side_effect=mocked_requests_get)
@mock.patch("ertviz.data_loader.get_info", side_effect=mocked_get_info)
def test_ensemble_selector_graph_constructor(mock_request, mock_get_info):
ensemble_dict = get_ensembles()
ensemble_dict = get_ensembles(project_id=None)
ensemble_models = {
schema["ref_url"]: EnsembleModel(schema["ref_url"]) for schema in ensemble_dict
schema["ref_url"]: EnsembleModel(schema["ref_url"], project_id=None)
for schema in ensemble_dict
}
graph_data = _construct_graph(ensemble_models)
parent_ensemble_node = {
Expand Down
2 changes: 1 addition & 1 deletion tests/views/test_ensemble_overview.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
def test_ensemble_overview(dash_duo, monkeypatch, mocker):
app = dash.Dash(__name__)

plugin = EnsembleOverview(mocker.Mock())
plugin = EnsembleOverview(mocker.Mock(), project_identifier=None)
layout = plugin.layout
app.layout = layout
dash_duo.start_server(app)
Expand Down

0 comments on commit ee6da48

Please sign in to comment.