From 72823ce027d0e37870015cb92eb2c9927113ae92 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Mon, 21 Aug 2023 13:51:54 -0700 Subject: [PATCH 01/37] Feature/update maap help tour (#61) updated maap help jupyter extension to version 1.0.0 --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 5537d8d..a32eb4a 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -61,7 +61,7 @@ RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 -- RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.3 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@0.0.46 --no-build +RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.0 --no-build RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build RUN jupyter lab build && \ From 00dceb4a7af8dcbf8c21ee1b51cca501e4f5311b Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Thu, 7 Sep 2023 11:38:12 -0700 Subject: [PATCH 02/37] Bugs/presigned url (#62) Main fix for the presigned url bug was changing 'maapsec/environment' to 'jupyter-server-extension/getConfig' There was another bug caused by a race condition that was causing users to not be able to get the presigned url about every 10th time. What fixed this bug is calling updateKeycloakToken upon the launch of the extension and also trying to call updateKeycloakToken again if getting the keycloak user information fails to get I confirmed this bug was fixed by trying to get the presigned url 25 times and it worked Successful build in vanilla here: https://repo.dit.maap-project.org/root/maap-workspaces/-/pipelines/3389 --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index a32eb4a..386cf01 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -60,7 +60,7 @@ RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0 RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 --no-build RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build -RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.3 --no-build +RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.0 --no-build RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build From e6d5677a77b8295df6eadf0a303dcf9dbf69d143 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Fri, 15 Sep 2023 14:09:25 -0700 Subject: [PATCH 03/37] Added memory extension (#59) added changes from cluttered commit branch --- jupyterlab3/docker/Dockerfile | 1 + jupyterlab3/entrypoint.sh | 50 ++++++++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 386cf01..176b28c 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -31,6 +31,7 @@ RUN echo "Checking if environment.yml exists for ${BASE_IMAGE_TYPE}" \ RUN npm install typescript -g RUN pip install jupyter-server==2.5.0 +RUN pip install jupyter-resource-usage==0.7.2 # Adjust permissions on home directory so writable by group root. RUN chgrp -Rf root /home/$NB_USER && chmod -Rf g+w /home/$NB_USER diff --git a/jupyterlab3/entrypoint.sh b/jupyterlab3/entrypoint.sh index 4e44a19..83e6368 100644 --- a/jupyterlab3/entrypoint.sh +++ b/jupyterlab3/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/bash # A more robust method of constructing the workspace url prefix -get_workspace_url_prefix() { +get_request_data() { python3 - <-che" + NAMESPACE="$CHE_WORKSPACE_NAMESPACE-che" if test -z "$PREVIEW_URL" then PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_NAMESPACE-$CHE_WORKSPACE_ID") # Che 7 UAT configuration fallback where the default namespace is "-", this will be deprecated + NAMESPACE="$CHE_WORKSPACE_NAMESPACE-$CHE_WORKSPACE_ID" fi if test -z "$PREVIEW_URL" then PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_ID") # Che 6 configuration fallback where the default namespace is the workspace id, this will be deprecated + NAMESPACE="$CHE_WORKSPACE_ID" fi if ! test -z "$PREVIEW_URL" # exit loop when it has a preview_url then @@ -115,13 +131,35 @@ mkdir -p /projects/.ssh/ chmod 700 /projects/.ssh/ service ssh restart +# Get maximum memory allocation for this workspace to display at bottom of notebook +get_max_memory() { + python3 - < '2' ]] && [[ $VERSION < '3' ]]; then SHELL=/bin/bash jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --NotebookApp.token='' --NotebookApp.base_url=$PREVIEW_URL --no-browser --debug elif [[ $VERSION > '3' ]] && [[ $VERSION < '4' ]]; then - SHELL=/bin/bash jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --ContentsManager.allow_hidden=True --ServerApp.token='' --ServerApp.base_url=$PREVIEW_URL --no-browser --debug --ServerApp.disable_check_xsrf=True + SHELL=/bin/bash jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --ContentsManager.allow_hidden=True --ServerApp.token='' --ServerApp.base_url=$PREVIEW_URL --no-browser --debug --ServerApp.disable_check_xsrf=True --ResourceUseDisplay.mem_limit=$MEMORY --ResourceUseDisplay.mem_warning_threshold=0.2 else echo "Error! Jupyterlab version not supported." -fi +fi \ No newline at end of file From 6e3e65aba2bb72a96e20929a7c4a1403049c0206 Mon Sep 17 00:00:00 2001 From: bsatoriu Date: Tue, 26 Sep 2023 11:58:45 -0700 Subject: [PATCH 04/37] hysds base-image [skip ci] (#65) --- base_images/hysds/docker/Dockerfile | 9 + base_images/hysds/docker/entrypoint.sh | 66 ++++ base_images/hysds/docker/proxy-httpd.conf | 372 ++++++++++++++++++++++ 3 files changed, 447 insertions(+) create mode 100644 base_images/hysds/docker/Dockerfile create mode 100644 base_images/hysds/docker/entrypoint.sh create mode 100644 base_images/hysds/docker/proxy-httpd.conf diff --git a/base_images/hysds/docker/Dockerfile b/base_images/hysds/docker/Dockerfile new file mode 100644 index 0000000..e8f2178 --- /dev/null +++ b/base_images/hysds/docker/Dockerfile @@ -0,0 +1,9 @@ +# docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf + +FROM httpd:2.4 + +RUN apt-get update && apt-get install -y python3 +COPY ./proxy-httpd.conf /usr/local/apache2/conf/httpd.conf +COPY ./entrypoint.sh /entrypoint.sh + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/base_images/hysds/docker/entrypoint.sh b/base_images/hysds/docker/entrypoint.sh new file mode 100644 index 0000000..24ef19d --- /dev/null +++ b/base_images/hysds/docker/entrypoint.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# A more robust method of constructing the workspace url prefix +get_workspace_url_prefix() { + python3 - <-che" + if test -z "$PREVIEW_URL" + then + PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_NAMESPACE-$CHE_WORKSPACE_ID") # Che 7 UAT configuration fallback where the default namespace is "-", this will be deprecated + fi + if test -z "$PREVIEW_URL" + then + PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_ID") # Che 6 configuration fallback where the default namespace is the workspace id, this will be deprecated + fi + if ! test -z "$PREVIEW_URL" # exit loop when it has a preview_url + then + break + fi + date # print timestamp in the logs if it doesn't get a URL + sleep 1 +done +# end more robust method + +PREVIEW_URL="$PREVIEW_URL" /usr/local/bin/httpd-foreground diff --git a/base_images/hysds/docker/proxy-httpd.conf b/base_images/hysds/docker/proxy-httpd.conf new file mode 100644 index 0000000..435d713 --- /dev/null +++ b/base_images/hysds/docker/proxy-httpd.conf @@ -0,0 +1,372 @@ +# +# This is the main Apache HTTP server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information. +# In particular, see +# +# for a discussion of each configuration directive. +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# +# Configuration and logfile names: If the filenames you specify for many +# of the server's control files begin with "/" (or "drive:/" for Win32), the +# server will use that explicit path. If the filenames do *not* begin +# with "/", the value of ServerRoot is prepended -- so "logs/access_log" +# with ServerRoot set to "/usr/local/apache2" will be interpreted by the +# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" +# will be interpreted as '/logs/access_log'. + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# Do not add a slash at the end of the directory path. If you point +# ServerRoot at a non-local disk, be sure to specify a local disk on the +# Mutex directive, if file-based mutexes are used. If you wish to share the +# same ServerRoot for multiple httpd daemons, you will need to change at +# least PidFile. +# +ServerRoot "/usr/local/apache2" + +# +# Mutex: Allows you to set the mutex mechanism and mutex file directory +# for individual mutexes, or change the global defaults +# +# Uncomment and change the directory if mutexes are file-based and the default +# mutex file directory is not on a local disk or is not appropriate for some +# other reason. +# +# Mutex default:logs + +# +# Listen: Allows you to bind Apache to specific IP addresses and/or +# ports, instead of the default. See also the +# directive. +# +# Change this to Listen on specific IP addresses as shown below to +# prevent Apache from glomming onto all bound IP addresses. +# +#Listen 12.34.56.78:80 +Listen 3100 + +# +# Dynamic Shared Object (DSO) Support +# +# To be able to use the functionality of a module which was built as a DSO you +# have to place corresponding `LoadModule' lines at this location so the +# directives contained in it are actually available _before_ they are used. +# Statically compiled modules (those listed by `httpd -l') do not need +# to be loaded here. +# +# Example: +# LoadModule foo_module modules/mod_foo.so +# +LoadModule mpm_event_module modules/mod_mpm_event.so +LoadModule authn_file_module modules/mod_authn_file.so +LoadModule authn_core_module modules/mod_authn_core.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authz_groupfile_module modules/mod_authz_groupfile.so +LoadModule authz_user_module modules/mod_authz_user.so +LoadModule authz_core_module modules/mod_authz_core.so +LoadModule access_compat_module modules/mod_access_compat.so +LoadModule auth_basic_module modules/mod_auth_basic.so +LoadModule reqtimeout_module modules/mod_reqtimeout.so +LoadModule include_module modules/mod_include.so +LoadModule filter_module modules/mod_filter.so +LoadModule substitute_module modules/mod_substitute.so +LoadModule mime_module modules/mod_mime.so +LoadModule log_config_module modules/mod_log_config.so +LoadModule env_module modules/mod_env.so +LoadModule headers_module modules/mod_headers.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule version_module modules/mod_version.so +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_http_module modules/mod_proxy_http.so +LoadModule ssl_module modules/mod_ssl.so +LoadModule unixd_module modules/mod_unixd.so +LoadModule status_module modules/mod_status.so +LoadModule autoindex_module modules/mod_autoindex.so + + #LoadModule cgid_module modules/mod_cgid.so + + + #LoadModule cgi_module modules/mod_cgi.so + +LoadModule dir_module modules/mod_dir.so +LoadModule alias_module modules/mod_alias.so +LoadModule rewrite_module modules/mod_rewrite.so + + +# +# If you wish httpd to run as a different user or group, you must run +# httpd as root initially and it will switch. +# +# User/Group: The name (or #number) of the user/group to run httpd as. +# It is usually good practice to create a dedicated user and group for +# running httpd, as with most system services. +# +User www-data +Group www-data + + + +ServerAdmin sujenshah@jpl.nasa.gov + + + AllowOverride none + Require all denied + + +DocumentRoot "/usr/local/apache2/htdocs" + + # + # Possible values for the Options directive are "None", "All", + # or any combination of: + # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews + # + # Note that "MultiViews" must be named *explicitly* --- "Options All" + # doesn't give it to you. + # + # The Options directive is both complicated and important. Please see + # http://httpd.apache.org/docs/2.4/mod/core.html#options + # for more information. + # + Options Indexes FollowSymLinks + + # + # AllowOverride controls what directives may be placed in .htaccess files. + # It can be "All", "None", or any combination of the keywords: + # AllowOverride FileInfo AuthConfig Limit + # + AllowOverride None + + # + # Controls who can get stuff from this server. + # + Require all granted + + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# + + DirectoryIndex index.html + + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + +# +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog /proc/self/fd/2 + +# +# LogLevel: Control the number of messages logged to the error_log. +# Possible values include: debug, info, notice, warn, error, crit, +# alert, emerg. +# +LogLevel warn + + + # + # The following directives define some format nicknames for use with + # a CustomLog directive (see below). + # + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + + + # You need to enable mod_logio.c to use %I and %O + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio + + + # + # The location and format of the access logfile (Common Logfile Format). + # If you do not define any access logfiles within a + # container, they will be logged here. Contrariwise, if you *do* + # define per- access logfiles, transactions will be + # logged therein and *not* in this file. + # + CustomLog /proc/self/fd/1 common + + # + # If you prefer a logfile with access, agent, and referer information + # (Combined Logfile Format) you can use the following directive. + # + #CustomLog "logs/access_log" combined + + + + # + # Redirect: Allows you to tell clients about documents that used to + # exist in your server's namespace, but do not anymore. The client + # will make a new request for the document at its new location. + # Example: + # Redirect permanent /foo http://www.example.com/bar + + # + # Alias: Maps web paths into filesystem paths and is used to + # access content that does not live under the DocumentRoot. + # Example: + # Alias /webpath /full/filesystem/path + # + # If you include a trailing / on /webpath then the server will + # require it to be present in the URL. You will also likely + # need to provide a section to allow access to + # the filesystem path. + + # + # ScriptAlias: This controls which directories contain server scripts. + # ScriptAliases are essentially the same as Aliases, except that + # documents in the target directory are treated as applications and + # run by the server when requested rather than as documents sent to the + # client. The same rules about trailing "/" apply to ScriptAlias + # directives as to Alias. + # + ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" + + + + + # + # ScriptSock: On threaded servers, designate the path to the UNIX + # socket used to communicate with the CGI daemon of mod_cgid. + # + #Scriptsock cgisock + + +# +# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Require all granted + + + + # + # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied + # backend servers which have lingering "httpoxy" defects. + # 'Proxy' request header is undefined by the IETF, not listed by IANA + # + RequestHeader unset Proxy early + + + + # + # TypesConfig points to the file containing the list of mappings from + # filename extension to MIME-type. + # + TypesConfig conf/mime.types + + # + # AddType allows you to add to or override the MIME configuration + # file specified in TypesConfig for specific file types. + # + #AddType application/x-gzip .tgz + # + # AddEncoding allows you to have certain browsers uncompress + # information on the fly. Note: Not all browsers support this. + # + #AddEncoding x-compress .Z + #AddEncoding x-gzip .gz .tgz + # + # If the AddEncoding directives above are commented-out, then you + # probably should define those extensions to indicate media types: + # + AddType application/x-compress .Z + AddType application/x-gzip .gz .tgz + + # + # AddHandler allows you to map certain file extensions to "handlers": + # actions unrelated to filetype. These can be either built into the server + # or added with the Action directive (see below) + # + # To use CGI scripts outside of ScriptAliased directories: + # (You will also need to add "ExecCGI" to the "Options" directive.) + # + #AddHandler cgi-script .cgi + + # For type maps (negotiated resources): + #AddHandler type-map var + + # + # Filters allow you to process content before it is sent to the client. + # + # To parse .shtml files for server-side includes (SSI): + # (You will also need to add "Includes" to the "Options" directive.) + # + #AddType text/html .shtml + #AddOutputFilter INCLUDES .shtml + + +# Configure mod_proxy_html to understand HTML4/XHTML1 + +Include conf/extra/proxy-html.conf + + +# Secure (SSL/TLS) connections +#Include conf/extra/httpd-ssl.conf +# +# Note: The following must must be present to support +# starting without SSL on platforms with no /dev/random equivalent +# but a statically compiled-in mod_ssl. +# + +SSLRandomSeed startup builtin +SSLRandomSeed connect builtin + + +PassEnv PREVIEW_URL + + + ProxyRequests Off + RewriteEngine On + SSLProxyEngine On + SSLProxyCheckPeerCN Off + Options Includes + + + Order deny,allow + Allow from all + + + # #TODO: Replace mozart-ip with appropriate IP address + ProxyPass / https://mozart-ip/ upgrade=websocket + ProxyPassReverse / https://mozart-ip/ + + AddOutputFilterByType SUBSTITUTE;INCLUDES text/html + # Fixes refresh at top level page + Substitute 's||/hysds_ui/figaro/" />|ni' + Substitute 's|="/hysds_ui|="/hysds_ui|ni' + Substitute 's|="//mozart|="/mozart|ni' + Substitute 's|="/mozart|="/mozart|ni' + Substitute 's|="/verdi|="/verdi|ni' + Substitute 's|="//grq|="/grq|ni' + Substitute 's|="/grq|="/grq|ni' + Substitute 's|="/icons|="/icons|ni' + + AddOutputFilterByType SUBSTITUTE;INCLUDES application/javascript + Substitute 's|ROOT_PATH="/hysds_ui/"|ROOT_PATH="/hysds_ui/"|ni' + Substitute 's|MOZART_BASE_URL=""|MOZART_BASE_URL=""|ni' + Substitute 's|METRICS_URL="|METRICS_URL="|ni' + # Fix API links, needs trailing slash + Substitute 's|v0.1"|v0.1/"|ni' + Substitute 's|v0.2"|v0.2/"|ni' + + From 1f06847c9e9e375abdc6c9e4d8524b8fcf0180f2 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 27 Sep 2023 13:26:26 -0700 Subject: [PATCH 05/37] Feature/libmamba solver (#64) * upgraded maap help jupyter extension version to 1.0.0 * reverted back changes * changed r docker to use libmamba solver * changed mamba install to conda * converted all images use libmamba solver like R image * added lang tz and debian frontend commands to vanilla docker image * copied pangeo dockerfile into vanilla * first line of packages back to vanilla versions * updated package versions for vanilla to be same as pangeo * updated isce2 package versions to match vanilla * updating continuumio/miniconda3 for rgedi and making other 3 top lines consistent * removed changes from rgedi --- base_images/isce2/docker/Dockerfile | 9 +++++---- base_images/isce3/docker/Dockerfile | 7 ++++--- base_images/pangeo/docker/Dockerfile | 7 +++++-- base_images/r/docker/Dockerfile | 7 ++++--- base_images/rgedi/docker/Dockerfile | 10 +++++++--- base_images/vanilla/docker/Dockerfile | 18 ++++++++++++------ jupyterlab3/docker/Dockerfile | 4 ++-- 7 files changed, 39 insertions(+), 23 deletions(-) diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile index 135aa3e..d2e09dd 100644 --- a/base_images/isce2/docker/Dockerfile +++ b/base_images/isce2/docker/Dockerfile @@ -30,13 +30,14 @@ RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge mamba=1.3.1 -RUN pip install pyOpenSSL==23.2.0 +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba # need to uninstall jupyter_server_terminals as it conflicts with Jupyterlab 3.4.x. Doesn't seem to break anything # but can get rid of if/when we upgrade jlab -RUN mamba install -y -c conda-forge -c plant plant=0.1.89dev isce2=2.6.2 matplotlib=3.5.1 Cython=0.29.28 \ - numba=0.55.1 pygeos=0.14.0 pyproj=3.4.1 rasterio=1.3.6 && \ +RUN conda install -y --solver=libmamba -c conda-forge -c plant plant=0.1.89dev isce2=2.6.2 matplotlib=3.6.2 Cython=0.29.33 \ + numba=0.56.4 pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 && \ pip uninstall -y jupyter_server_terminals && \ find /opt/conda/ -follow -type f -name '*.a' -delete && \ find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index 47be8c5..257df4e 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -16,10 +16,11 @@ RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge mamba=1.4.2 -RUN pip install pyOpenSSL==23.2.0 +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba -RUN mamba install -y -c conda-forge isce3=0.12.0 xarray=2023.4.2 \ +RUN conda install -y --solver=libmamba -c conda-forge isce3=0.12.0 xarray=2023.4.2 \ hvplot=0.8.3 fsspec=2023.5.0 scikit-learn=1.2.2 && \ find /opt/conda/ -follow -type f -name '*.a' -delete && \ find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index 80d25d9..a2c9946 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -13,8 +13,11 @@ RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -c conda-forge mamba && \ - mamba install -c conda-forge -y gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba + +RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ && find /opt/conda/ -follow -type f -name '*.a' -delete \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 16ff83f..7a71ecb 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -16,10 +16,11 @@ RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge mamba=1.3.1 -RUN pip install pyOpenSSL==23.2.0 +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba -RUN mamba install -y -c conda-forge r==4.2 r-rgdal==1.5_32 r-sf==1.0_7 r-irkernel==1.3.2 r-gridExtra==2.3 \ +RUN conda install -y --solver=libmamba -c conda-forge r==4.2 r-rgdal==1.5_32 r-sf==1.0_7 r-irkernel==1.3.2 r-gridExtra==2.3 \ r-tidyverse==2.0.0 r-randomForest==4.7_1.1 r-raster==3.6_20 r-data.table==1.14.8 r-rlist==0.4.6.2 \ r-gdalutils==2.0.3.2 r-stringr==1.5.0 && \ find /opt/conda/ -follow -type f -name '*.a' -delete && \ diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile index 16aabe4..3ebb25b 100644 --- a/base_images/rgedi/docker/Dockerfile +++ b/base_images/rgedi/docker/Dockerfile @@ -11,9 +11,13 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd && echo "source activate r-with-gdal" > ~/.bashrc RUN apt-get update && apt-get install -y libxt-dev && apt-get clean -RUN conda install -y -c conda-forge mamba && \ - mamba install -y -c conda-forge nb_conda_kernels -RUN mamba create --name r-with-gdal -c conda-forge -c r -c csdms-stack gdal r-rgdal r-sf r-irkernel r-gridExtra r-tidyverse \ +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba + +RUN conda install -y --solver=libmamba -c conda-forge nb_conda_kernels + +RUN conda create --name r-with-gdal --solver=libmamba -c conda-forge -c r -c csdms-stack gdal r-rgdal r-sf r-irkernel r-gridExtra r-tidyverse \ r-randomForest r-raster r-data.table r-rlist r-gdalutils r-stringr r-devtools sysroot_linux-64=2.17 gcc r-lwgeom szip --yes && \ /opt/conda/bin/conda clean -afy RUN mkdir -p ~/.R/ && echo "LDFLAGS=-lproj" >> ~/.R/Makevars && \ diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 9daabac..2e0fe5d 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -1,4 +1,7 @@ FROM continuumio/miniconda3:22.11.1 +ENV LANG en_US.UTF-8 +ENV TZ US/Pacific +ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' @@ -10,12 +13,15 @@ RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -c conda-forge mamba && \ - mamba install -c conda-forge -y gdal=3.4.1 matplotlib=3.5.1 Cython=0.29.28 h5py=3.6.0 numba=0.55.1 \ - pygeos=0.12.0 pyproj=3.3.0 rasterio=1.2.10 scipy=1.8.0 && \ - find /opt/conda/ -follow -type f -name '*.a' -delete && \ - find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ - /opt/conda/bin/conda clean -afy +RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ + conda install -y -n base conda-libmamba-solver && \ + conda config --set solver libmamba + +RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ + pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ + && find /opt/conda/ -follow -type f -name '*.a' -delete \ + && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ + && /opt/conda/bin/conda clean -afy ARG IMAGE_REF ENV DOCKERIMAGE_PATH=${IMAGE_REF} diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 176b28c..04fc1c9 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -23,10 +23,10 @@ RUN apt-get clean && apt-get update && \ RUN echo "Checking if environment.yml exists for ${BASE_IMAGE_TYPE}" \ ; if [ -f "/${BASE_IMAGE_TYPE}/environment.yml" ]; then \ echo "Installing packages from '/${BASE_IMAGE_TYPE}/environment.yml'" \ - ; mamba env update --name base --file "/${BASE_IMAGE_TYPE}/environment.yml" \ + ; conda env update --name base --file "/${BASE_IMAGE_TYPE}/environment.yml" --solver libmamba \ ; else \ echo "Installing packages from '/shared/environment.yml'" \ - ; mamba env update --name base --file "/shared/environment.yml" \ + ; conda env update --name base --file "/shared/environment.yml" --solver libmamba \ ; fi RUN npm install typescript -g From a0c6ac596d75c14c20f13c4e8e87e5d1f9790249 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Fri, 29 Sep 2023 11:35:14 -0700 Subject: [PATCH 06/37] Update stac_ipyleaflet to 0.3.5 for Pangeo (#66) * Updated pinned version of stac_ipyleaflet to 0.3.5 for pangeo jupyter workspace. * Added environment variables to Pangeo environment yml. * Updated entrypoint bash script so the the base environment is activated before launching jupyter so that environment variables are accessible within jupyter. --------- Co-authored-by: Alex --- jupyterlab3/entrypoint.sh | 6 ++++-- jupyterlab3/pangeo/environment.yml | 9 ++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/jupyterlab3/entrypoint.sh b/jupyterlab3/entrypoint.sh index 83e6368..fa32971 100644 --- a/jupyterlab3/entrypoint.sh +++ b/jupyterlab3/entrypoint.sh @@ -155,11 +155,13 @@ MEMORY=$(get_max_memory "$NAMESPACE") # TBD maap-py install +source /opt/conda/bin/activate base +export SHELL=/bin/bash VERSION=$(jupyter lab --version) if [[ $VERSION > '2' ]] && [[ $VERSION < '3' ]]; then - SHELL=/bin/bash jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --NotebookApp.token='' --NotebookApp.base_url=$PREVIEW_URL --no-browser --debug + jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --NotebookApp.token='' --NotebookApp.base_url=$PREVIEW_URL --no-browser --debug elif [[ $VERSION > '3' ]] && [[ $VERSION < '4' ]]; then - SHELL=/bin/bash jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --ContentsManager.allow_hidden=True --ServerApp.token='' --ServerApp.base_url=$PREVIEW_URL --no-browser --debug --ServerApp.disable_check_xsrf=True --ResourceUseDisplay.mem_limit=$MEMORY --ResourceUseDisplay.mem_warning_threshold=0.2 + jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --ContentsManager.allow_hidden=True --ServerApp.token='' --ServerApp.base_url=$PREVIEW_URL --no-browser --debug --ServerApp.disable_check_xsrf=True --ResourceUseDisplay.mem_limit=$MEMORY --ResourceUseDisplay.mem_warning_threshold=0.2 else echo "Error! Jupyterlab version not supported." fi \ No newline at end of file diff --git a/jupyterlab3/pangeo/environment.yml b/jupyterlab3/pangeo/environment.yml index 0c3753d..46e3c5b 100644 --- a/jupyterlab3/pangeo/environment.yml +++ b/jupyterlab3/pangeo/environment.yml @@ -18,7 +18,14 @@ dependencies: - shapely=2.0.1 - xmltodict=0.13.0 - xarray=2023.5.0 + - pip - pip: - rio_tiler==4.1.11 - pystac_client==0.6.1 - - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.2.0#egg-info=stac_ipyleaflet \ No newline at end of file + - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.5#egg-info=stac_ipyleaflet +variables: + TITILER_STAC_ENDPOINT: 'https://titiler-stac.maap-project.org/' + TITILER_ENDPOINT: 'https://titiler.maap-project.org/' + STAC_CATALOG_NAME: 'MAAP STAC' + STAC_CATALOG_URL: 'https://stac.maap-project.org/' + STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' From 6ffbf7656065275980c4249c742b7bd90a934720 Mon Sep 17 00:00:00 2001 From: bsatoriu Date: Fri, 29 Sep 2023 16:03:20 -0700 Subject: [PATCH 07/37] Remove hysds base_image [skip-ci] (#68) --- base_images/hysds/docker/Dockerfile | 9 - base_images/hysds/docker/entrypoint.sh | 66 ---- base_images/hysds/docker/proxy-httpd.conf | 372 ---------------------- 3 files changed, 447 deletions(-) delete mode 100644 base_images/hysds/docker/Dockerfile delete mode 100644 base_images/hysds/docker/entrypoint.sh delete mode 100644 base_images/hysds/docker/proxy-httpd.conf diff --git a/base_images/hysds/docker/Dockerfile b/base_images/hysds/docker/Dockerfile deleted file mode 100644 index e8f2178..0000000 --- a/base_images/hysds/docker/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -# docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf - -FROM httpd:2.4 - -RUN apt-get update && apt-get install -y python3 -COPY ./proxy-httpd.conf /usr/local/apache2/conf/httpd.conf -COPY ./entrypoint.sh /entrypoint.sh - -ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/base_images/hysds/docker/entrypoint.sh b/base_images/hysds/docker/entrypoint.sh deleted file mode 100644 index 24ef19d..0000000 --- a/base_images/hysds/docker/entrypoint.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# A more robust method of constructing the workspace url prefix -get_workspace_url_prefix() { - python3 - <-che" - if test -z "$PREVIEW_URL" - then - PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_NAMESPACE-$CHE_WORKSPACE_ID") # Che 7 UAT configuration fallback where the default namespace is "-", this will be deprecated - fi - if test -z "$PREVIEW_URL" - then - PREVIEW_URL=$(get_workspace_url_prefix "$CHE_WORKSPACE_ID") # Che 6 configuration fallback where the default namespace is the workspace id, this will be deprecated - fi - if ! test -z "$PREVIEW_URL" # exit loop when it has a preview_url - then - break - fi - date # print timestamp in the logs if it doesn't get a URL - sleep 1 -done -# end more robust method - -PREVIEW_URL="$PREVIEW_URL" /usr/local/bin/httpd-foreground diff --git a/base_images/hysds/docker/proxy-httpd.conf b/base_images/hysds/docker/proxy-httpd.conf deleted file mode 100644 index 435d713..0000000 --- a/base_images/hysds/docker/proxy-httpd.conf +++ /dev/null @@ -1,372 +0,0 @@ -# -# This is the main Apache HTTP server configuration file. It contains the -# configuration directives that give the server its instructions. -# See for detailed information. -# In particular, see -# -# for a discussion of each configuration directive. -# -# Do NOT simply read the instructions in here without understanding -# what they do. They're here only as hints or reminders. If you are unsure -# consult the online docs. You have been warned. -# -# Configuration and logfile names: If the filenames you specify for many -# of the server's control files begin with "/" (or "drive:/" for Win32), the -# server will use that explicit path. If the filenames do *not* begin -# with "/", the value of ServerRoot is prepended -- so "logs/access_log" -# with ServerRoot set to "/usr/local/apache2" will be interpreted by the -# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" -# will be interpreted as '/logs/access_log'. - -# -# ServerRoot: The top of the directory tree under which the server's -# configuration, error, and log files are kept. -# -# Do not add a slash at the end of the directory path. If you point -# ServerRoot at a non-local disk, be sure to specify a local disk on the -# Mutex directive, if file-based mutexes are used. If you wish to share the -# same ServerRoot for multiple httpd daemons, you will need to change at -# least PidFile. -# -ServerRoot "/usr/local/apache2" - -# -# Mutex: Allows you to set the mutex mechanism and mutex file directory -# for individual mutexes, or change the global defaults -# -# Uncomment and change the directory if mutexes are file-based and the default -# mutex file directory is not on a local disk or is not appropriate for some -# other reason. -# -# Mutex default:logs - -# -# Listen: Allows you to bind Apache to specific IP addresses and/or -# ports, instead of the default. See also the -# directive. -# -# Change this to Listen on specific IP addresses as shown below to -# prevent Apache from glomming onto all bound IP addresses. -# -#Listen 12.34.56.78:80 -Listen 3100 - -# -# Dynamic Shared Object (DSO) Support -# -# To be able to use the functionality of a module which was built as a DSO you -# have to place corresponding `LoadModule' lines at this location so the -# directives contained in it are actually available _before_ they are used. -# Statically compiled modules (those listed by `httpd -l') do not need -# to be loaded here. -# -# Example: -# LoadModule foo_module modules/mod_foo.so -# -LoadModule mpm_event_module modules/mod_mpm_event.so -LoadModule authn_file_module modules/mod_authn_file.so -LoadModule authn_core_module modules/mod_authn_core.so -LoadModule authz_host_module modules/mod_authz_host.so -LoadModule authz_groupfile_module modules/mod_authz_groupfile.so -LoadModule authz_user_module modules/mod_authz_user.so -LoadModule authz_core_module modules/mod_authz_core.so -LoadModule access_compat_module modules/mod_access_compat.so -LoadModule auth_basic_module modules/mod_auth_basic.so -LoadModule reqtimeout_module modules/mod_reqtimeout.so -LoadModule include_module modules/mod_include.so -LoadModule filter_module modules/mod_filter.so -LoadModule substitute_module modules/mod_substitute.so -LoadModule mime_module modules/mod_mime.so -LoadModule log_config_module modules/mod_log_config.so -LoadModule env_module modules/mod_env.so -LoadModule headers_module modules/mod_headers.so -LoadModule setenvif_module modules/mod_setenvif.so -LoadModule version_module modules/mod_version.so -LoadModule proxy_module modules/mod_proxy.so -LoadModule proxy_http_module modules/mod_proxy_http.so -LoadModule ssl_module modules/mod_ssl.so -LoadModule unixd_module modules/mod_unixd.so -LoadModule status_module modules/mod_status.so -LoadModule autoindex_module modules/mod_autoindex.so - - #LoadModule cgid_module modules/mod_cgid.so - - - #LoadModule cgi_module modules/mod_cgi.so - -LoadModule dir_module modules/mod_dir.so -LoadModule alias_module modules/mod_alias.so -LoadModule rewrite_module modules/mod_rewrite.so - - -# -# If you wish httpd to run as a different user or group, you must run -# httpd as root initially and it will switch. -# -# User/Group: The name (or #number) of the user/group to run httpd as. -# It is usually good practice to create a dedicated user and group for -# running httpd, as with most system services. -# -User www-data -Group www-data - - - -ServerAdmin sujenshah@jpl.nasa.gov - - - AllowOverride none - Require all denied - - -DocumentRoot "/usr/local/apache2/htdocs" - - # - # Possible values for the Options directive are "None", "All", - # or any combination of: - # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews - # - # Note that "MultiViews" must be named *explicitly* --- "Options All" - # doesn't give it to you. - # - # The Options directive is both complicated and important. Please see - # http://httpd.apache.org/docs/2.4/mod/core.html#options - # for more information. - # - Options Indexes FollowSymLinks - - # - # AllowOverride controls what directives may be placed in .htaccess files. - # It can be "All", "None", or any combination of the keywords: - # AllowOverride FileInfo AuthConfig Limit - # - AllowOverride None - - # - # Controls who can get stuff from this server. - # - Require all granted - - -# -# DirectoryIndex: sets the file that Apache will serve if a directory -# is requested. -# - - DirectoryIndex index.html - - -# -# The following lines prevent .htaccess and .htpasswd files from being -# viewed by Web clients. -# - - Require all denied - - -# -# ErrorLog: The location of the error log file. -# If you do not specify an ErrorLog directive within a -# container, error messages relating to that virtual host will be -# logged here. If you *do* define an error logfile for a -# container, that host's errors will be logged there and not here. -# -ErrorLog /proc/self/fd/2 - -# -# LogLevel: Control the number of messages logged to the error_log. -# Possible values include: debug, info, notice, warn, error, crit, -# alert, emerg. -# -LogLevel warn - - - # - # The following directives define some format nicknames for use with - # a CustomLog directive (see below). - # - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - LogFormat "%h %l %u %t \"%r\" %>s %b" common - - - # You need to enable mod_logio.c to use %I and %O - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio - - - # - # The location and format of the access logfile (Common Logfile Format). - # If you do not define any access logfiles within a - # container, they will be logged here. Contrariwise, if you *do* - # define per- access logfiles, transactions will be - # logged therein and *not* in this file. - # - CustomLog /proc/self/fd/1 common - - # - # If you prefer a logfile with access, agent, and referer information - # (Combined Logfile Format) you can use the following directive. - # - #CustomLog "logs/access_log" combined - - - - # - # Redirect: Allows you to tell clients about documents that used to - # exist in your server's namespace, but do not anymore. The client - # will make a new request for the document at its new location. - # Example: - # Redirect permanent /foo http://www.example.com/bar - - # - # Alias: Maps web paths into filesystem paths and is used to - # access content that does not live under the DocumentRoot. - # Example: - # Alias /webpath /full/filesystem/path - # - # If you include a trailing / on /webpath then the server will - # require it to be present in the URL. You will also likely - # need to provide a section to allow access to - # the filesystem path. - - # - # ScriptAlias: This controls which directories contain server scripts. - # ScriptAliases are essentially the same as Aliases, except that - # documents in the target directory are treated as applications and - # run by the server when requested rather than as documents sent to the - # client. The same rules about trailing "/" apply to ScriptAlias - # directives as to Alias. - # - ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" - - - - - # - # ScriptSock: On threaded servers, designate the path to the UNIX - # socket used to communicate with the CGI daemon of mod_cgid. - # - #Scriptsock cgisock - - -# -# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased -# CGI directory exists, if you have that configured. -# - - AllowOverride None - Options None - Require all granted - - - - # - # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied - # backend servers which have lingering "httpoxy" defects. - # 'Proxy' request header is undefined by the IETF, not listed by IANA - # - RequestHeader unset Proxy early - - - - # - # TypesConfig points to the file containing the list of mappings from - # filename extension to MIME-type. - # - TypesConfig conf/mime.types - - # - # AddType allows you to add to or override the MIME configuration - # file specified in TypesConfig for specific file types. - # - #AddType application/x-gzip .tgz - # - # AddEncoding allows you to have certain browsers uncompress - # information on the fly. Note: Not all browsers support this. - # - #AddEncoding x-compress .Z - #AddEncoding x-gzip .gz .tgz - # - # If the AddEncoding directives above are commented-out, then you - # probably should define those extensions to indicate media types: - # - AddType application/x-compress .Z - AddType application/x-gzip .gz .tgz - - # - # AddHandler allows you to map certain file extensions to "handlers": - # actions unrelated to filetype. These can be either built into the server - # or added with the Action directive (see below) - # - # To use CGI scripts outside of ScriptAliased directories: - # (You will also need to add "ExecCGI" to the "Options" directive.) - # - #AddHandler cgi-script .cgi - - # For type maps (negotiated resources): - #AddHandler type-map var - - # - # Filters allow you to process content before it is sent to the client. - # - # To parse .shtml files for server-side includes (SSI): - # (You will also need to add "Includes" to the "Options" directive.) - # - #AddType text/html .shtml - #AddOutputFilter INCLUDES .shtml - - -# Configure mod_proxy_html to understand HTML4/XHTML1 - -Include conf/extra/proxy-html.conf - - -# Secure (SSL/TLS) connections -#Include conf/extra/httpd-ssl.conf -# -# Note: The following must must be present to support -# starting without SSL on platforms with no /dev/random equivalent -# but a statically compiled-in mod_ssl. -# - -SSLRandomSeed startup builtin -SSLRandomSeed connect builtin - - -PassEnv PREVIEW_URL - - - ProxyRequests Off - RewriteEngine On - SSLProxyEngine On - SSLProxyCheckPeerCN Off - Options Includes - - - Order deny,allow - Allow from all - - - # #TODO: Replace mozart-ip with appropriate IP address - ProxyPass / https://mozart-ip/ upgrade=websocket - ProxyPassReverse / https://mozart-ip/ - - AddOutputFilterByType SUBSTITUTE;INCLUDES text/html - # Fixes refresh at top level page - Substitute 's||/hysds_ui/figaro/" />|ni' - Substitute 's|="/hysds_ui|="/hysds_ui|ni' - Substitute 's|="//mozart|="/mozart|ni' - Substitute 's|="/mozart|="/mozart|ni' - Substitute 's|="/verdi|="/verdi|ni' - Substitute 's|="//grq|="/grq|ni' - Substitute 's|="/grq|="/grq|ni' - Substitute 's|="/icons|="/icons|ni' - - AddOutputFilterByType SUBSTITUTE;INCLUDES application/javascript - Substitute 's|ROOT_PATH="/hysds_ui/"|ROOT_PATH="/hysds_ui/"|ni' - Substitute 's|MOZART_BASE_URL=""|MOZART_BASE_URL=""|ni' - Substitute 's|METRICS_URL="|METRICS_URL="|ni' - # Fix API links, needs trailing slash - Substitute 's|v0.1"|v0.1/"|ni' - Substitute 's|v0.2"|v0.2/"|ni' - - From f8d7e6430e6f3ba36fa05f364dfc338c002287f0 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Mon, 9 Oct 2023 08:50:03 -0700 Subject: [PATCH 08/37] Bugs/quick fix libmamba (#69) * removed libmamba sovler from conda env update * added solver to environment.yml * added conda libmamba solver version * added back in solvers and pinned version for conda-libmamba-solver * added back in space --- base_images/isce2/docker/Dockerfile | 2 +- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/rgedi/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile index d2e09dd..c5b2968 100644 --- a/base_images/isce2/docker/Dockerfile +++ b/base_images/isce2/docker/Dockerfile @@ -31,7 +31,7 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba # need to uninstall jupyter_server_terminals as it conflicts with Jupyterlab 3.4.x. Doesn't seem to break anything diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index 257df4e..d624e71 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -17,7 +17,7 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge isce3=0.12.0 xarray=2023.4.2 \ diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index a2c9946..0c3f871 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -14,7 +14,7 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 7a71ecb..76cbacf 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -17,7 +17,7 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge r==4.2 r-rgdal==1.5_32 r-sf==1.0_7 r-irkernel==1.3.2 r-gridExtra==2.3 \ diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile index 3ebb25b..9e19e5a 100644 --- a/base_images/rgedi/docker/Dockerfile +++ b/base_images/rgedi/docker/Dockerfile @@ -12,7 +12,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd && echo "source activate r-wit RUN apt-get update && apt-get install -y libxt-dev && apt-get clean RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge nb_conda_kernels diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 2e0fe5d..75d69eb 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -14,7 +14,7 @@ WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver && \ + conda install -y -n base conda-libmamba-solver=23.7.0 && \ conda config --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ From 3ba1e9c345d6d93daa6aa2687261072fecfb8ce1 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 10 Oct 2023 16:14:03 -0700 Subject: [PATCH 09/37] Bugs/presigned url (#70) * changed dit url to test * changed dit back and changed ops to be maap-ops-workspace instead of dataset --- jupyterlab3/environments.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/environments.json b/jupyterlab3/environments.json index 5ba6e4d..f8d5190 100644 --- a/jupyterlab3/environments.json +++ b/jupyterlab3/environments.json @@ -37,7 +37,7 @@ "auth_server": "auth.maap-project.org", "mas_server": "mas.maap-project.org", "edsc_server": "ade.maap-project.org:30052", - "workspace_bucket": "maap-ops-dataset", + "workspace_bucket": "maap-ops-workspace", "default_host": false } ] From a17b41c40ce7aae30afa32236612c7464044c382 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:12:24 -0700 Subject: [PATCH 10/37] Bugs/git tour link (#71) * manual build for change to maap help * updated npm version of maap help --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 04fc1c9..c539ecf 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -62,7 +62,7 @@ RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 -- RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.0 --no-build +RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.1 --no-build RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build RUN jupyter lab build && \ From 3606ad86e41c4702ba4f4fce5bf2f8ca7cd4d782 Mon Sep 17 00:00:00 2001 From: Marjorie Lucas <47004511+marjo-luc@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:28:59 -0700 Subject: [PATCH 11/37] updated custom ext versions (#72) --- jupyterlab3/docker/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index c539ecf..b439e73 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -51,18 +51,18 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements ############################### # Custom Jupyter Extensions ############################### -RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.4.6 --no-build +RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.1 --no-build # PyPi package prepended with 'maap' so it more easily discoverable -RUN pip install maap-jupyter-server-extension==1.1.1 +RUN pip install maap-jupyter-server-extension==1.2.0 RUN jupyter server extension enable jupyter_server_extension -RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0.1.1 --no-build +RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0.2.0 --no-build RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 --no-build RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.1 --no-build +RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.0 --no-build RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build RUN jupyter lab build && \ From 76f252c47b3686bfdd3737108a910b8bbcd4110e Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 25 Oct 2023 21:16:10 -0700 Subject: [PATCH 12/37] Feature/update maap py (#73) upgraded all maap py versions to 3.1.2 --- base_images/isce2/docker/Dockerfile | 2 +- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/rgedi/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile index c5b2968..b5f9e75 100644 --- a/base_images/isce2/docker/Dockerfile +++ b/base_images/isce2/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index d624e71..fcfc4b6 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index 0c3f871..b2ed2b0 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 76cbacf..c2cc938 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile index 9e19e5a..0351853 100644 --- a/base_images/rgedi/docker/Dockerfile +++ b/base_images/rgedi/docker/Dockerfile @@ -2,7 +2,7 @@ FROM continuumio/miniconda3:4.12.0 # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 75d69eb..873e499 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.0.1 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . From 4b4fc3f40409eef6ee95d80a7762aafe576149d1 Mon Sep 17 00:00:00 2001 From: Marjorie Lucas <47004511+marjo-luc@users.noreply.github.com> Date: Fri, 27 Oct 2023 18:55:45 -0700 Subject: [PATCH 13/37] bumped jupyter server extension (#74) * update server ext * bumped server ext --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index b439e73..29753e7 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -54,7 +54,7 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.1 --no-build # PyPi package prepended with 'maap' so it more easily discoverable -RUN pip install maap-jupyter-server-extension==1.2.0 +RUN pip install maap-jupyter-server-extension==1.2.2 RUN jupyter server extension enable jupyter_server_extension RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0.2.0 --no-build From 25cced2c9f05184297555b8548add8409ae4e47e Mon Sep 17 00:00:00 2001 From: bsatoriu Date: Fri, 27 Oct 2023 19:08:34 -0700 Subject: [PATCH 14/37] Bump maap-py to v3.1.3 (#75) --- base_images/isce2/docker/Dockerfile | 2 +- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/rgedi/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile index b5f9e75..7f345db 100644 --- a/base_images/isce2/docker/Dockerfile +++ b/base_images/isce2/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index fcfc4b6..0d6e7f4 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index b2ed2b0..2e49605 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index c2cc938..cd9f645 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile index 0351853..6725ec7 100644 --- a/base_images/rgedi/docker/Dockerfile +++ b/base_images/rgedi/docker/Dockerfile @@ -2,7 +2,7 @@ FROM continuumio/miniconda3:4.12.0 # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 873e499..47a8f19 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -5,7 +5,7 @@ ARG DEBIAN_FRONTEND=noninteractive # install maap-py library ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.2 https://github.com/MAAP-Project/maap-py.git \ +RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ && cd maap-py \ && pip install -e . From 72140d99789327a74595da99fe0b9dbbbbf4a535 Mon Sep 17 00:00:00 2001 From: Marjorie Lucas <47004511+marjo-luc@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:19:48 -0700 Subject: [PATCH 15/37] Update Dockerfile --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 29753e7..72b6782 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -62,7 +62,7 @@ RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 -- RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.0 --no-build +RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.1 --no-build RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build RUN jupyter lab build && \ From f3b5f96bcdc8064b1dd183b48a5ddb81ae63a949 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:03:14 -0600 Subject: [PATCH 16/37] Bugs/libmamba default (#77) * added conda config setting libmamba solver to entrypoint.sh * updated maap help to version 1.0.1 * converted back to 1.0.0 * trying to create .condarc file * removed touch because might work without it * upgraded conda libmamba solver * undid change because forgot I had PR open for this branch * added --system tag and removed conda config from entrypoint * added the system tag to all base image dockerfiles --- base_images/isce2/docker/Dockerfile | 2 +- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/rgedi/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile index 7f345db..5d12e23 100644 --- a/base_images/isce2/docker/Dockerfile +++ b/base_images/isce2/docker/Dockerfile @@ -32,7 +32,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba # need to uninstall jupyter_server_terminals as it conflicts with Jupyterlab 3.4.x. Doesn't seem to break anything # but can get rid of if/when we upgrade jlab diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index 0d6e7f4..7e97861 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -18,7 +18,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge isce3=0.12.0 xarray=2023.4.2 \ hvplot=0.8.3 fsspec=2023.5.0 scikit-learn=1.2.2 && \ diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index 2e49605..0b9db8c 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -15,7 +15,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index cd9f645..cd7e7a1 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -18,7 +18,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge r==4.2 r-rgdal==1.5_32 r-sf==1.0_7 r-irkernel==1.3.2 r-gridExtra==2.3 \ r-tidyverse==2.0.0 r-randomForest==4.7_1.1 r-raster==3.6_20 r-data.table==1.14.8 r-rlist==0.4.6.2 \ diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile index 6725ec7..14d2734 100644 --- a/base_images/rgedi/docker/Dockerfile +++ b/base_images/rgedi/docker/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get update && apt-get install -y libxt-dev && apt-get clean RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge nb_conda_kernels diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 47a8f19..46bd7aa 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -15,7 +15,7 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --set solver libmamba + conda config --system --set solver libmamba RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ From 9cbf22d64664c318444bbdea907337794d5d6099 Mon Sep 17 00:00:00 2001 From: bsatoriu Date: Wed, 29 Nov 2023 10:23:21 -0800 Subject: [PATCH 17/37] Update entrypoint.sh (#78) --- jupyterlab3/entrypoint.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jupyterlab3/entrypoint.sh b/jupyterlab3/entrypoint.sh index fa32971..434b371 100644 --- a/jupyterlab3/entrypoint.sh +++ b/jupyterlab3/entrypoint.sh @@ -93,6 +93,9 @@ done export NOTEBOOKLIBPATH=$(find /opt/conda/lib/ -maxdepth 3 -type d -name "notebook") export JUPYTERSERVERLIBPATH=$(find /opt/conda/lib -maxdepth 3 -type d -name "jupyter_server") +# Fix "fatal: not a git repository" error on startup +export GIT_DISCOVERY_ACROSS_FILESYSTEM=1 + read -r -d '' JUPYTER_PATCH << EOM # Fix for Tornado's inability to handle proxy requests from tornado.routing import _RuleList @@ -164,4 +167,4 @@ elif [[ $VERSION > '3' ]] && [[ $VERSION < '4' ]]; then jupyter lab --ip=0.0.0.0 --port=3100 --allow-root --ContentsManager.allow_hidden=True --ServerApp.token='' --ServerApp.base_url=$PREVIEW_URL --no-browser --debug --ServerApp.disable_check_xsrf=True --ResourceUseDisplay.mem_limit=$MEMORY --ResourceUseDisplay.mem_warning_threshold=0.2 else echo "Error! Jupyterlab version not supported." -fi \ No newline at end of file +fi From e45301d47072f4dee2bb7d729d8a7dd08c31df07 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:07:30 -0600 Subject: [PATCH 18/37] Bugs/double submit null username (#79) * updated maap help to version 1.0.1 * converted back to 1.0.0 * upgraded dps version to add feature disabling submit button/ saying last submitted info and fixing the null username bug --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 72b6782..9ccfd5d 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -51,7 +51,7 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements ############################### # Custom Jupyter Extensions ############################### -RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.1 --no-build +RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.2 --no-build # PyPi package prepended with 'maap' so it more easily discoverable RUN pip install maap-jupyter-server-extension==1.2.2 From b9fb0ca01eaabc9a3d26294181b6fa5c32188733 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:21:46 -0600 Subject: [PATCH 19/37] Features/update workspace dependencies (#80) * Updated how conda packages installs are handled at the base image layer for Pangeo to use an environment.yml file like we do for its respective jupyterlab image. * Updated to miniconda 23.5.2-0 for the pangeo base image. * Updated list of packages for the base and jupyter images for the Pangeo Workspace. * updated maap help to version 1.0.1 * converted back to 1.0.0 * Clean up of pangeo base environment.yml * Reverted the miniconda version of base pangeo image to 22.11.1. * Updated jupyterlab3 pangeo docker conda solver parameter * Modified base pangeo image conda env update solver parameter spec * explicility installing libarchive fron conda-forge to test resolution of issue with libmamba. * Testing base pangeo conda install parameter updates. * Test builds using new version of miniconda. * Test another build configuration on gitlab using new pinned version of conda-libmamba-solver * Bumped miniconda version to 23.10.0-1 and removed conda-libmamba-solver since libmamba is the default solver in this new version of miniconda. * Updated Pangeo base image and environment yml so that packages are installed in a new environment named with the workspace type to resolve issues with libarchive/libmamba and the installation of packages. * Updated Pangeo jupyterlab dockerfile and environment yml to use new custom environment instead of base environment. * Moved a couple jupyter python packages from dockerfile to the environment yml. * Updated entrypoint to test new environment variable that stores the type of workspace being run to ensure jupyter can be launched appropriately. * Patch issue with ARG values not carrying over to downstream build stages in docker file. Also replaced use of BUILD_IMAGE_TYPE with ENV var, "WORKSPACE_TYPE". * Pinned jupyterlab package to 3.6.1 to fix build issue with jupyterlab_plotly. * Pinned additional packages to assist with resolving jupyterlab build issues. * Commented line "conda init" in entrypoint.sh. * Reverted commenting out "conda init" in entrypoint that was previously done for testing. * Testing changes "~/.bash_profile" to properly set the default conda environment for terminals. * Updated path variable to point to our custom conda environment bin instead of the conda base env bin path. * Updated how the default environment is activated for terminals. * removed jupyter-server from envirionment yml as the jupyterlab installation takes care of installing the jupyter_server package already. * Added Makefile which contains commonly run recipes when modifying workspaces locally and needing to test building them. * Updated notebook lib path and jupyter server lib path to point to the appropriate custom conda environment. * current attempt at fixing r workspace issues, building for base image but not for jupyterlab3 * r image building successfully locally * added conda lists * Added perl package to r base environment.yml to resolve issue with r-tinytex not installing. * Added string replacement commands to remove conda env related commands from .bash_profile that are no longer needed. * Updated jupyterlab3's dockerfile so that it modifies the "jupyterlab3/shared/environment.yml" by doing a string replacement on the workspace environment name for workspaces that don't have a custom environment.yml. * r image building locally * pinned versions * updated pinned versions * changed version for r-dplyr * new botocore version * added aiobotocore dependency * removed aiobotocore from install * removed botocore install * added half of the packages to see if I can get rid of the botocore warning * removed some more environment.yml packages because still getting botocore error * removed even more packages because still getting botocore warnining * removed more packages because still getting botocore warning * Added conda list to dockerfiles for testing on ADE. * added maap py into pip install from source * updated git install from source * added v to version tag for maappy * added a bunch of conda lists trying to debug * installing maap py to root * corrected installing into root bug * added run pwd line to try to debug * tried setting the working directory to root before git clone * tried adding another pwd command * removed . from git clone * set working directory to maap py * added back in . for git clone * Updated packages for base and jupyterlab reported by data team that are needed in Python based workspaces. * Updated the folder parameter for where maap-py is installed to hopefully resolve maap-py installation issues. * Moved maap py conf environment variable to base environment yml. * commented out some of the code trying to test maap py again * commented back in code before adding in Anils code that worked * cleaning up jupyterlab3 dockerfile so is consistent * removed extra ; * removed pip install of maap py * updated botocore version in base environment.yml * added binary library files to r install * Removed commented ENV command in pangeo dockerfile. * Updated miniconda version for base vanilla image. * Updated base vanilla image to use an environment yml to store it's configuration environment. Vanilla base image now relies on a custom vanilla conda environment. * Updated jupyterlab shared environment yml so that 1) missing packages needed by data team are included, 2) each workspace uses a custom conda environment, and 3) updated entrypoint so that .bash_profile is cleaned up. * added r-car * pinned r-car version and removed botocore3 * added maap py to environment.yml to avoid botocore dependency errors * Added help documentation to Makefile along with other minor improvements. * commented out git clone for r image * Pinned pangeo packages and removed duplicates. * Pinned packages for vanilla and shared workspace environment ymls. Added missing jupyter package to shared environment yml. * Bumped stac_ipyleaflet to version 0.3.6 for pangeo workspace. * created isce3 environment.yml and pinned r binary library versions * fixed name of fsspec * added isce3 to the jupyterlab3 dockerfile * removed dependencies from isce3 environment.yml * added back in dependencies and removed environment.yml for isce3 in jupyter image * removed packages specific to isce3 * added in 3 packages but isce3 to see if that is the problem * added back in isce3 * removed all vanilla packages and just trying to install base isce3 packages * pinned python version * attempting to install r packages via script * pinned versions for fsspec, hvplot, isce3, xarray * added and modified r scripts and removed awscli trying to fix maappy dependency error * trying to add awscli after maappy install * capitalized Fgmutils * added packages to environment.yml * changed maappy branch to bugs/dependency issues * upgraded awscli version * unpinned versions for vanilla environment.yml * removed all r packages except python and r * unpinned python version * changed back to v3.1.3 tag for maap-py * downgraded awscli to 2.14.1 * upgraded awscali to 2.14.2 * removed pinnection vertsions for cryptography and prompt-toolkit * r image should be building now, doesnt include Fgmutils * unpinned versions to fix maap-py bug in vanilla workspace * pinned vanilla versions and changed to dependecies branch for pangeo and isce3 * changed branch for maappy to version with ipython pinned * pinned botocore version and added conda list * moved conda list command and just pushed maappy pinning boto3=1.33.13 * removed botocore from r/environment.yml * changed to correctly use repos and removed print statements * fixed but for Fgmutils install * pinned package versions that were dependency of Fgmutils * added r channel to r environment.yml * downgraded version of r-devemf * downgraded r and r-base to 4.2.3 to be compatible with r-devemf * changed to r version 4.2 * downgraded r essentials to 4.2 * Added geocube to vanilla base image which was added to pangeo but accidentally omitted from vanilla. * Added additional packages requested by user group for python based workspaces. * Removed pins for vanilla and pangeo base image to test new image builds on GitLab with additional packages. * Updated pinned versions for vanilla base image as well as shared environment yml for jupyterlab. Also bumped jupyterlab to 3.6.3 and added missing package, rio-tiler. * Added pinned version information for pangeo base and jupyterlab images. Also modified version information for jupyterlab to 3.6.3 to resolve version descrepancy with pangeo-notebook package. * Removed pin to test installation of the morecantile package. * Fixed typo of morecantile package in pangeo base image. * Repinned morecantile package for pangeo and vanilla base images. * removed print statements and conda lists * added conda config lines just for testing * added descriptions necessary to use install2.r with GPL license * removed lines making conda forge default because that should be a different PR * updated all maap-py branches to be new 3.1.4 release --------- Co-authored-by: Anil Natha --- Makefile | 56 ++++++ base_images/isce3/docker/Dockerfile | 35 ++-- base_images/isce3/environment.yml | 51 +++++ base_images/pangeo/docker/Dockerfile | 28 +-- base_images/pangeo/environment.yml | 96 +++++++++ base_images/r/docker/Dockerfile | 68 +++++-- base_images/r/environment.yml | 108 ++++++++++ base_images/r/scripts/install2.r | 187 ++++++++++++++++++ .../r/scripts/install_cran_packages_r.sh | 22 +++ base_images/vanilla/docker/Dockerfile | 28 +-- base_images/vanilla/environment.yml | 51 +++++ jupyterlab3/docker/Dockerfile | 44 ++++- jupyterlab3/entrypoint.sh | 19 +- jupyterlab3/isce3/environment.yml | 16 -- jupyterlab3/pangeo/environment.yml | 35 ++-- jupyterlab3/shared/environment.yml | 21 +- 16 files changed, 746 insertions(+), 119 deletions(-) create mode 100644 Makefile create mode 100644 base_images/isce3/environment.yml create mode 100644 base_images/pangeo/environment.yml create mode 100644 base_images/r/environment.yml create mode 100644 base_images/r/scripts/install2.r create mode 100755 base_images/r/scripts/install_cran_packages_r.sh create mode 100644 base_images/vanilla/environment.yml delete mode 100644 jupyterlab3/isce3/environment.yml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..917e8f4 --- /dev/null +++ b/Makefile @@ -0,0 +1,56 @@ +export IMAGE_NAME ?= vanilla +export PROJECT_PREFIX = maap_ +export BASE_IMAGE_NAME = "${PROJECT_PREFIX}base_${IMAGE_NAME}" +export JUPYTER_IMAGE_NAME = "${PROJECT_PREFIX}jupyter_${IMAGE_NAME}" +export RUN_OPTIONS = + +build-images: build-base-image build-jupyter-image + +build-images-no-cache: build-base-image-no-cache build-jupyter-image-no-cache + +build-base-image: ## Build the base image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + @cd base_images/${IMAGE_NAME}; \ + pwd; \ + docker buildx build --platform linux/amd64 --progress=plain $(RUN_OPTIONS) -t ${BASE_IMAGE_NAME} -f docker/Dockerfile . + +build-base-image-no-cache: RUN_OPTIONS = "--no-cache" +build-base-image-no-cache: build-base-image + +build-jupyter-image: ## Build the jupyter image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + @cd jupyterlab3; \ + pwd; \ + docker buildx build --platform linux/amd64 --progress=plain $(RUN_OPTIONS) -t ${JUPYTER_IMAGE_NAME} --build-arg BASE_IMAGE_TYPE=${IMAGE_NAME} --build-arg BASE_IMAGE=${BASE_IMAGE_NAME} -f docker/Dockerfile . + +build-jupyter-image-no-cache: RUN_OPTIONS = "--no-cache" +build-jupyter-image-no-cache: build-jupyter-image + +delete-image: delete-base-image delete-jupyter-image ## Delete the base and jupyter image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + +delete-base-image: ## Delete the base image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + docker image rm ${BASE_IMAGE_NAME} + +delete-jupyter-image: ## Delete the jupyter image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + docker image rm ${JUPYTER_IMAGE_NAME} + +open-jupyter: ## Open a browser window to access an already running instance of a 'vanilla' jupyter image, or the workspace specified by setting the argument, IMAGE_NAME= + open http://localhost:3100/ + +start-jupyter: ## Start the jupyter image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= + docker run -p 3100:3100 ${JUPYTER_IMAGE_NAME} + +# ---------------------------------------------------------------------------- +# Self-Documented Makefile +# ref: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +# ---------------------------------------------------------------------------- +help: ## (DEFAULT) This help information + @echo ==================================================================== + @grep -E '^## .*$$' \ + $(MAKEFILE_LIST) \ + | awk 'BEGIN { FS="## " }; {printf "\033[33m%-20s\033[0m \n", $$2}' + @echo + @grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' \ + $(MAKEFILE_LIST) \ + | awk 'BEGIN { FS=":.*?## " }; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' \ +# | sort +.PHONY: help +.DEFAULT_GOAL := help \ No newline at end of file diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index 7e97861..b72cb45 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -1,32 +1,31 @@ -FROM continuumio/miniconda3:22.11.1 +FROM continuumio/miniconda3:23.10.0-1 ENV LANG en_US.UTF-8 ENV TZ US/Pacific ARG DEBIAN_FRONTEND=noninteractive -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - -RUN set -ex \ - && apt-get update +#RUN set -ex \ +# && apt-get update RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba +COPY ./environment.yml /tmp +RUN conda env create -y -f "/tmp/environment.yml" \ + && find /opt/conda/ -follow -type f -name '*.a' -delete \ + && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ + && /opt/conda/bin/conda clean -afy + +# Set the conda environemnt for all subsequent docker RUN commands +# When maap-py is updated and installed via our environment.yml, +# we won't need this line unless other envrionment specific commands are added +SHELL ["conda", "run", "-n", "isce3", "/bin/bash", "-c"] -RUN conda install -y --solver=libmamba -c conda-forge isce3=0.12.0 xarray=2023.4.2 \ - hvplot=0.8.3 fsspec=2023.5.0 scikit-learn=1.2.2 && \ - find /opt/conda/ -follow -type f -name '*.a' -delete && \ - find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ - /opt/conda/bin/conda clean -afy +RUN mkdir /maap-py \ + && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && pip install -e /maap-py/ -RUN pip install git+https://github.com/opera-adt/RTC.git@v0.3 +RUN conda list ARG IMAGE_REF ENV DOCKERIMAGE_PATH=${IMAGE_REF} diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml new file mode 100644 index 0000000..f4f1316 --- /dev/null +++ b/base_images/isce3/environment.yml @@ -0,0 +1,51 @@ +name: isce3 +channels: + - conda-forge + - nodefaults +dependencies: + - awscli=2.14.1 + - backoff=2.2.1 + - boto3=1.34.3 + - cython=3.0.7 + - earthengine-api=0.1.384 + - fsspec=2023.12.2 + - gdal=3.7.0 + - geopandas=0.14.1 + - h5py=3.9.0 + - hdf5=1.14.1 + - httpx=0.25.2 + - hvplot=0.9.0 + - isce3=0.14.0 + - mapclassify=2.6.1 + - matplotlib=3.8.2 + - mpl-scatter-density=0.7 + - numba=0.58.1 + - numpy=1.26.2 + - pandas=2.1.4 + - pycurl=7.45.1 + - pygeos=0.14 + - pyogrio=0.6.0 + - pyproj=3.6.1 + - pystac-client=0.7.5 + - python=3.10.13 + - rasterio=1.3.8 + - rasterstats=0.19.0 + - requests=2.31.0 + - rio-cogeo=5.1.0 + - rtree=1.1.0 + - s3fs=0.4.2 + - scikit-learn=1.3.2 + - scipy=1.11.4 + - seaborn=0.13.0 + - shapely=2.0.1 + - sliderule=4.1.0 + - statsmodels=0.14.1 + - tqdm=4.66.1 + - unidecode=1.3.7 + - xmltodict=0.13.0 + - xarray=2023.12.0 + - pip=23.3.2 + - pip: + - git+https://github.com/opera-adt/RTC.git@v0.3 +variables: + MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index 0b9db8c..b59f18a 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -1,27 +1,29 @@ -FROM continuumio/miniconda3:22.11.1 +FROM continuumio/miniconda3:23.10.0-1 ENV LANG en_US.UTF-8 ENV TZ US/Pacific ARG DEBIAN_FRONTEND=noninteractive -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba - -RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ - pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ +COPY ./environment.yml /tmp +RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.a' -delete \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy +# Set the conda environemnt for all subsequent docker RUN commands +# When maap-py is updated and installed via our environment.yml, +# we won't need this line unless other envrionment specific commands are added +SHELL ["conda", "run", "-n", "pangeo", "/bin/bash", "-c"] + +# Install maap-py library +RUN mkdir /maap-py \ + && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && pip install -e /maap-py/ + +RUN conda list + ARG IMAGE_REF ENV DOCKERIMAGE_PATH=${IMAGE_REF} \ No newline at end of file diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml new file mode 100644 index 0000000..eeecb06 --- /dev/null +++ b/base_images/pangeo/environment.yml @@ -0,0 +1,96 @@ +name: pangeo +channels: + - conda-forge + - nodefaults +dependencies: + - awscli=2.14.1 + - backoff=2.2.1 + - basemap=1.3.7 + - bokeh=3.3.3 + - boto3=1.33.13 + - bottleneck=1.3.7 + - cartopy=0.22.0 + - cfgrib=0.9.10.4 + - cython=3.0.7 + - dask-ml=2023.3.24 + - datashader=0.16.0 + - descartes=1.1.0 + - earthaccess=0.8.2 + - earthengine-api=0.1.384 + - eofs=1.4.0 + - erddapy=2.2.0 + - esmpy=8.4.2 + - flox=0.8.6 + - fsspec=2023.12.2 + - gcm_filters=0.3.0 + - gdal=3.7.0 + - geocube=0.4.2 + - geopandas=0.14.2 + - geoviews-core=1.11.0 + - h5netcdf=1.3.0 + - h5py=3.9.0 + - hdf5=1.14.0 + - holoviews=1.18.1 + - httpx=0.26.0 + - hvplot=0.9.1 + - intake=0.7.0 + - intake-geopandas=0.4.0 + - intake-stac=0.4.0 + - intake-xarray=0.7.0 + - kerchunk=0.2.2 + - lxml=4.9.3 + - lz4=4.3.2 + - mapclassify=2.6.1 + - matplotlib=3.7.3 + - mizani=0.10.0 + - mpl-scatter-density=0.7 + - nc-time-axis=1.4.1 + - netcdf4=1.6.4 + - numba=0.58.1 + - numcodecs=0.11.0 + - numpy=1.26.3 + - odc-stac=0.3.8 + - pandas=2.1.4 + - pandarallel=1.6.5 + - pyarrow=14.0.1 + - pycurl=7.45.1 + - pydap=3.4.0 + - pygeos=0.14 + - pyogrio=0.6.0 + - pyproj=3.5.0 + - pystac=1.9.0 + - pystac-client=0.6.1 + - python=3.10.13 + - python-blosc=1.10.6 + - rasterio=1.3.7 + - rasterstats=0.19.0 + - rechunker=0.5.2 + - requests=2.31.0 + - rio-cogeo=5.1.1 + - rioxarray=0.15.0 + - rtree=1.1.0 + - s3fs=2023.12.2 + - scikit-image=0.22.0 + - scikit-learn=1.3.2 + - scipy=1.11.4 + - seaborn=0.13.1 + - shapely=2.0.1 + - sliderule=4.1.0 + - sparse=0.15.0 + - stackstac=0.5.0 + - statsmodels=0.14.1 + - tqdm=4.66.1 + - unidecode=1.3.7 + - xarray=2023.12.0 + - xarray-datatree=0.0.13 + - xarray-spatial=0.3.5 + - xarrayutils=2.0.0 + - xesmf=0.8.2 + - xhistogram=0.3.2 + - xmltodict=0.13.0 + - zarr=2.16.1 + - pip=23.3.2 + - pip: + - morecantile==5.1.0 +variables: + MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index cd7e7a1..1461106 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -1,31 +1,63 @@ -FROM continuumio/miniconda3:22.11.1 +FROM continuumio/miniconda3:23.10.0-1 ENV LANG en_US.UTF-8 ENV TZ US/Pacific ARG DEBIAN_FRONTEND=noninteractive -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - -RUN set -ex \ - && apt-get update +#RUN set -ex \ +# && apt-get update RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba +RUN apt-get clean && apt-get update && \ + apt-get install -y --no-install-recommends gdal-bin=3.2.2+dfsg-2+deb11u2 \ + lbzip2=2.5-2.1 \ + libfftw3-dev=3.3.8-2 \ + libgdal-dev=3.2.2+dfsg-2+deb11u2 \ + libgeos-dev=3.9.0-1 \ + libgl1-mesa-dev=20.3.5-1 \ + libglu1-mesa-dev=9.0.1-1 \ + libhdf4-alt-dev=4.2.15-3 \ + libhdf5-dev=1.10.6+repack-4+deb11u1 \ + libjq-dev=1.6-2.1 \ + libpq-dev=13.13-0+deb11u1 \ + libproj-dev=7.2.1-1 \ + libprotobuf-dev=3.12.4-1+deb11u1 \ + libnetcdf-dev=1:4.7.4-1 \ + libsqlite3-dev=3.34.1-3 \ + libssl-dev=1.1.1w-0+deb11u1 \ + libudunits2-dev=2.2.28-3 \ + netcdf-bin=1:4.7.4-1 \ + postgis=3.1.1+dfsg-1+deb11u2 \ + protobuf-compiler=3.12.4-1+deb11u1 \ + sqlite3=3.34.1-3 \ + tk-dev=8.6.11+1 \ + unixodbc-dev=2.3.6-0.1+b1 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +COPY ./environment.yml /tmp +RUN conda env create -y -f "/tmp/environment.yml" \ + && find /opt/conda/ -follow -type f -name '*.a' -delete \ + && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ + && /opt/conda/bin/conda clean -afy + +# Set the conda environemnt for all subsequent docker RUN commands +# When maap-py is updated and installed via our environment.yml, +# we won't need this line unless other envrionment specific commands are added +SHELL ["conda", "run", "-n", "r", "/bin/bash", "-c"] + +ADD . / +RUN ["chmod", "+x", "/scripts/install_cran_packages_r.sh"] +RUN /scripts/install_cran_packages_r.sh + +# Install maap-py library +RUN mkdir /maap-py \ + && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && pip install -e /maap-py/ -RUN conda install -y --solver=libmamba -c conda-forge r==4.2 r-rgdal==1.5_32 r-sf==1.0_7 r-irkernel==1.3.2 r-gridExtra==2.3 \ - r-tidyverse==2.0.0 r-randomForest==4.7_1.1 r-raster==3.6_20 r-data.table==1.14.8 r-rlist==0.4.6.2 \ - r-gdalutils==2.0.3.2 r-stringr==1.5.0 && \ - find /opt/conda/ -follow -type f -name '*.a' -delete && \ - find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ - /opt/conda/bin/conda clean -afy +RUN conda list ARG IMAGE_REF ENV DOCKERIMAGE_PATH=${IMAGE_REF} \ No newline at end of file diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml new file mode 100644 index 0000000..7a1e13e --- /dev/null +++ b/base_images/r/environment.yml @@ -0,0 +1,108 @@ +name: r +channels: + - conda-forge + - r + - nodefaults +dependencies: + - awscli=2.14.1 + - earthaccess=0.8.2 + - parallel=20231122 + - perl=5.32.1 + - postgis=3.4.0 + - python=3.10.13 + - r=4.2 + - r-aws.s3=0.3.22 + - r-base=4.2.3 + - r-broom=1.0.5 + - r-car=3.1_2 + - r-chron=2.3_61 + - r-classint=0.4_10 + - r-covr=3.6.4 + - r-data.table=1.14.10 + - r-dbi=1.1.3 + - r-deldir=2.0_2 + - r-devemf=4.0_2 + - r-dplyr=1.1.4 + - r-egg=0.4.5 + - r-essentials=4.2 + - r-fs=1.6.3 + - r-geojsonio=0.11.3 + - r-geojsonsf=2.0.3 + - r-geor=1.9_2 + - r-geosphere=1.5_18 + - r-ggnewscale=0.4.9 + - r-ggplot2=3.4.4 + - r-ggspatial=1.1.9 + - r-ggtext=0.1.2 + - r-gridExtra=2.3 + - r-gstat=2.1_1 + - r-gsubfn=0.7 + - r-hdf5r=1.3.8 + - r-irkernel=1.3.2 + - r-jpeg=0.1_10 + - r-knitr=1.45 + - r-leafem=0.2.3 + - r-leaflet=2.2.1 + - r-lidR=4.0.4 + - r-lwgeom=0.2_13 + - r-mapdata=2.3.1 + - r-mapproj=1.2.11 + - r-maps=3.4.1.1 + - r-maptools=1.1_8 + - r-mapview=2.11.2 + - r-microbenchmark=1.4.10 + - r-ncdf4=1.22 + - r-nlme=3.1_164 + - r-patchwork=1.1.3 + - r-plogr=0.2.0 + - r-plyr=1.8.9 + - r-png=0.1_8 + - r-pool=1.0.1 + - r-proj4=1.0_13 + - r-proto=1.0.0 + - r-protolite=2.3.0 + - r-randomFields=3.3.14 + - r-randomForest=4.7_1.1 + - r-raster=3.6_26 + - r-rcolorbrewer=1.1_3 + - r-readxl=1.4.3 + - r-reticulate=1.34.0 + - r-rgee=1.1.7 + - r-rgeos=0.6_4 + - r-rlas=1.6.2 + - r-rlist=0.4.6.2 + - r-rmarkdown=2.25 + - r-rnaturalearth=0.3.4 + - r-rnaturalearthdata=0.1.0 + - r-RNetCDF=2.6_2 + - r-rockchalk=1.8.157 + - r-rodbc=1.3_23 + - r-RPostgres=1.4.5 + - r-RPostgreSQL=0.7_5 + - r-RSQLite=2.3.4 + - r-rstac=0.9.2_5 + - r-scales=1.3.0 + - r-sf=1.0_14 + - r-snow=0.4_4 + - r-spacetime=1.3_1 + - r-spatialreg=1.3_1 + - r-spatstat=3.0_7 + - r-spdep=1.3_1 + - r-sqldf=0.4_11 + - r-stars=0.6_4 + - r-stringr=1.5.1 + - r-terra=1.7_55 + - r-testthat=3.2.1 + - r-tibble=3.2.1 + - r-tidync=0.3.0 + - r-tidyr=1.3.0 + - r-tidyverse=2.0.0 + - r-tmap=3.3_4 + - r-units=0.8_5 + - r-viridis=0.6.4 + - pip=23.3.2 + - pip: + - ff==0.0.10 + - grid==0.7.1 +variables: + MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/r/scripts/install2.r b/base_images/r/scripts/install2.r new file mode 100644 index 0000000..29ca318 --- /dev/null +++ b/base_images/r/scripts/install2.r @@ -0,0 +1,187 @@ +#!/usr/bin/env r +# +# A second example to install one or more packages, now with option parsing +# +# Copyright (C) 2011 - 2014 Dirk Eddelbuettel +# Copyright (C) 2014 - 2017 Carl Boettiger and Dirk Eddelbuettel +# Copyright (C) 2018 - 2023 Carl Boettiger, Dirk Eddelbuettel, Brandon Bertelsen, and SHIMA Tatsuya +# +# Released under GPL (>= 2) +# This file was extracted from this repository https://github.com/rocker-org/rocker-versioned2 +# The license of this repository (rocker-versioned2) can be view here: +# https://github.com/rocker-org/rocker-versioned2/blob/master/LICENSE + +# Warranty description we are required to convey: +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +# Any questions, please contact: grace.llewellyn@jpl.nasa.gov + + +## load docopt package from CRAN +# Grace Llewellyn added the repos parameter to fix a bug +install.packages('docopt', repos = "http://cran.us.r-project.org") +library(docopt) + +## default to first library location in .libPaths() +libloc <- .libPaths()[1] + +## configuration for docopt +doc <- paste0("Usage: install2.r [-l LIBLOC] [-h] [-x] [-s] [-d DEPS] [-n NCPUS] [-r REPOS...] [-m METHOD] [-t TYPE] [--error] [--skipmissing] [--] [PACKAGES ...] + +-l --libloc LIBLOC location in which to install [default: ", libloc, "] +-d --deps DEPS install suggested dependencies as well [default: NA] +-n --ncpus NCPUS number of processes to use for parallel install, -1 selects all cores [default: getOption] +-r --repos REPOS repositor(y|ies) to use, or NULL for file [default: getOption] +-e --error throw error and halt instead of a warning [default: FALSE] +--skipmissing use with the --error option, skip the packages missing error [default: FALSE] +-s --skipinstalled skip installing already installed packages [default: FALSE] +-m --method METHOD method to be used for downloading files [default: auto] +-t --type TYPE installation type as used by `install.packages` [default: getOption] +-h --help show this help text +-x --usage show help and short example usage") +opt <- docopt(doc) # docopt parsing +if (opt$usage) { + cat(doc, "\n\n") + cat("where PACKAGES... can be one or more CRAN package names, or local (binary or source) +package files (where extensions .tar.gz, .tgz and .zip are recognised). Optional +arguments understood by R CMD INSTALL can be passed interspersed in the PACKAGES, though +this requires use of '--'. + +Examples: + install2.r -l /tmp/lib Rcpp BH # install into given library + install2.r -- --with-keep.source drat # keep the source + install2.r -- --data-compress=bzip2 stringdist # prefer bz2 compression + install2.r \".\" # install package in current directory + install2.r -n 6 ggplot2 # parallel install: (6 processes) + +install2.r is part of littler which brings 'r' to the command-line. +See https://dirk.eddelbuettel.com/code/littler.html for more information.\n") + q("no") +} +if (opt$deps == "TRUE" || opt$deps == "FALSE") { + opt$deps <- as.logical(opt$deps) +} else if (opt$deps == "NA") { + opt$deps <- NA +} +## docopt results are characters, so if we meant NULL we have to set NULL +if (length(opt$repos) == 1 && "NULL" %in% opt$repos) { + opt$repos <- NULL +} + +if ("getOption" %in% opt$repos) { + ## as littler can now read ~/.littler.r and/or /etc/littler.r we can preset elsewhere + opt$repos <- c(opt$repos[which(opt$repos != "getOption")], getOption("repos")) +} + +if (opt$ncpus == "getOption") { + opt$ncpus <- getOption("Ncpus", 1L) +} else if (opt$ncpus == "-1") { + ## parallel comes with R 2.14+ + opt$ncpus <- max(1L, parallel::detectCores()) +} + +## type should reflects bspm where available +if (opt$type == "getOption") { + opt$type <- getOption("pkgType") + #if (requireNamespace("bspm", quietly=TRUE) && Sys.info()[["sysname"]] == "Linux") opt$type <- "binary-source" + +} + +## ensure installation is stripped +Sys.setenv("_R_SHLIB_STRIP_"="true") +install_packages2 <- function(pkgs, ..., error = FALSE, skipmissing = FALSE, skipinstalled = FALSE) { + e <- NULL + capture <- function(e) { + if (error) { + catch <- + grepl("(download|installation) of package .* failed", e$message) || + (grepl("(dependenc|package).*(is|are) not available", e$message) && !skipmissing) || + grepl("installation of package.*had non-zero exit status", e$message) || + grepl("installation of .+ package(|s) failed", e$message) + if (catch) { + e <<- e + } + } + } + if (skipinstalled) { + pkgs <- setdiff(pkgs, installed.packages()[,1]) + } + if (length(pkgs) > 0) { + withCallingHandlers(install.packages(pkgs, ...), warning = capture) + if (!is.null(e)) { + stop(e$message, call. = FALSE) + } + } +} + +## helper function to for existing files with matching extension +isMatchingFile <- function(f) (file.exists(f) && grepl("(\\.tar\\.gz|\\.tgz|\\.zip)$", f)) || (f == ".") + +## helper function which switches to local (ie NULL) repo if matching file is presented +installArg <- function(f, lib, rep, dep, iopts, error, skipmissing, skipinstalled, ncpus, method, type) { + install_packages2(pkgs=f, + lib=lib, + repos=if (isMatchingFile(f)) NULL else rep, + dependencies=dep, + INSTALL_opts=iopts, + Ncpus = ncpus, + method = method, + type = type, + error = error, + skipmissing = skipmissing, + skipinstalled = skipinstalled) +} + +## strip out arguments to be passed to R CMD INSTALL +isArg <- grepl('^--',opt$PACKAGES) +installOpts <- opt$PACKAGES[isArg] +opt$PACKAGES <- opt$PACKAGES[!isArg] + +if (length(opt$PACKAGES)==0 && file.exists("DESCRIPTION") && file.exists("NAMESPACE")) { + ## we are in a source directory, so build it + message("* installing *source* package found in current working directory ...") + opt$PACKAGES <- "." +} + +## helper function to for existing files with matching extension +isMatchingFile <- + function(f) (file.exists(f) && + grepl("(\\.tar\\.gz|\\.tgz|\\.zip)$", f)) || (f == ".") + +## check arguments for local files -- if none, then we can pass vector on +isLocal <- sapply(opt$PACKAGES, isMatchingFile) + +## for any local sources loop explicitly as before, otherwise for remote +## packages pass vector to install_packages2 which does the rest (and +## possibly in parallel using up to ncpus) +if (any(isLocal)) { + sapply(opt$PACKAGES, installArg, opt$libloc, opt$repos, opt$deps, + installOpts, opt$error, opt$skipmissing, opt$skipinstalled, opt$ncpus, opt$method, opt$type) +} else { + install_packages2(pkgs = opt$PACKAGES, + lib = opt$libloc, + repos = opt$repos, + dependencies = opt$deps, + INSTALL_opts = installOpts, + Ncpus = opt$ncpus, + method = opt$method, + type = opt$type, + error = opt$error, + skipmissing = opt$skipmissing, + skipinstalled = opt$skipinstalled) +} + +## clean up any temp file containing CRAN directory information +sapply(list.files(path=tempdir(), pattern="^(repos|libloc).*\\.rds$", full.names=TRUE), unlink) \ No newline at end of file diff --git a/base_images/r/scripts/install_cran_packages_r.sh b/base_images/r/scripts/install_cran_packages_r.sh new file mode 100755 index 0000000..b3b1e62 --- /dev/null +++ b/base_images/r/scripts/install_cran_packages_r.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +# always set this for scripts but don't declare as ENV.. +export DEBIAN_FRONTEND=noninteractive + +## build ARGs +NCPUS=${NCPUS:--1} + +Rscript /scripts/install2.r --error --skipmissing --skipinstalled -r "http://cran.us.r-project.org" -n "$NCPUS" nlraa sfarrow Fgmutils + +# Clean up +rm -rf /var/lib/apt/lists/* +if [ -d '/tmp/downloaded_packages' ]; then + rm -r /tmp/downloaded_packages +fi +#rm -r /tmp/downloaded_packages + +if [ -f '/usr/local/lib/R/site-library/*/libs/*.so' ]; then + strip /usr/local/lib/R/site-library/*/libs/*.so +fi +#strip /usr/local/lib/R/site-library/*/libs/*.so \ No newline at end of file diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 46bd7aa..26e97e6 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -1,27 +1,29 @@ -FROM continuumio/miniconda3:22.11.1 +FROM continuumio/miniconda3:23.10.0-1 ENV LANG en_US.UTF-8 ENV TZ US/Pacific ARG DEBIAN_FRONTEND=noninteractive -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - RUN mkdir /projects WORKDIR /projects RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba - -RUN conda install -y --solver=libmamba -c conda-forge gdal=3.6.2 matplotlib=3.6.2 Cython=0.29.33 h5py=3.7.0 numba=0.56.4 \ - pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 scipy=1.10.0 \ +COPY ./environment.yml /tmp +RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.a' -delete \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy +# Set the conda environemnt for all subsequent docker RUN commands +# When maap-py is updated and installed via our environment.yml, +# we won't need this line unless other envrionment specific commands are added +SHELL ["conda", "run", "-n", "vanilla", "/bin/bash", "-c"] + +# Install maap-py library +RUN mkdir /maap-py \ + && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && pip install -e /maap-py/ + +RUN conda list + ARG IMAGE_REF ENV DOCKERIMAGE_PATH=${IMAGE_REF} diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml new file mode 100644 index 0000000..d89bea8 --- /dev/null +++ b/base_images/vanilla/environment.yml @@ -0,0 +1,51 @@ +name: vanilla +channels: + - conda-forge + - nodefaults +dependencies: + - awscli=2.14.1 + - backoff=2.2.1 + - basemap=1.3.7 + - boto3=1.34.15 + - cython=3.0.7 + - earthengine-api=0.1.384 + - gdal=3.7.0 + - geocube=0.4.2 + - geopandas=0.14.2 + - h5py=3.9.0 + - hdf5=1.14.0 + - httpx=0.26.0 + - mapclassify=2.6.1 + - matplotlib=3.7.3 + - mizani=0.10.0 + - mpl-scatter-density=0.7 + - numba=0.58.1 + - numpy=1.26.3 + - pandas=2.1.4 + - pandarallel=1.6.5 + - pycurl=7.45.1 + - pygeos=0.14 + - pyogrio=0.6.0 + - pyproj=3.5.0 + - pystac-client=0.7.5 + - python=3.10.13 + - rasterio=1.3.7 + - rasterstats=0.19.0 + - requests=2.31.0 + - rio-cogeo=5.1.1 + - rtree=1.1.0 + - s3fs=0.4.2 + - scikit-learn=1.3.2 + - scipy=1.11.4 + - seaborn=0.13.1 + - shapely=2.0.1 + - sliderule=4.1.0 + - statsmodels=0.14.1 + - tqdm=4.66.1 + - unidecode=1.3.7 + - xmltodict=0.13.0 + - pip=23.3.2 + - pip: + - morecantile==5.1.0 +variables: + MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 9ccfd5d..9e629fa 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -1,7 +1,27 @@ ARG BASE_IMAGE -FROM ${BASE_IMAGE} as jupyterlab_base +ARG BASE_IMAGE_TYPE +FROM ${BASE_IMAGE} as jupyterlab_base ARG BASE_IMAGE_TYPE +# Set WORKSPACE_TYPE, used by entrypoint.sh +ENV WORKSPACE_TYPE=${BASE_IMAGE_TYPE} + +# Create base images for each workspace needed for build stage later +FROM jupyterlab_base as workspace_base_pangeo +SHELL ["conda", "run", "-n", "pangeo", "/bin/bash", "-c"] + +FROM jupyterlab_base as workspace_base_vanilla +SHELL ["conda", "run", "-n", "vanilla", "/bin/bash", "-c"] + +FROM jupyterlab_base as workspace_base_r +SHELL ["conda", "run", "-n", "r", "/bin/bash", "-c"] + +FROM jupyterlab_base as workspace_base_isce3 +SHELL ["conda", "run", "-n", "isce3", "/bin/bash", "-c"] + +FROM workspace_base_${BASE_IMAGE_TYPE} AS workspace_base + +FROM workspace_base as workspace_build_stage ADD . / @@ -20,18 +40,17 @@ RUN apt-get clean && apt-get update && \ rm -rf /var/lib/apt/lists/* # Install workspace specific packages for conda environment -RUN echo "Checking if environment.yml exists for ${BASE_IMAGE_TYPE}" \ - ; if [ -f "/${BASE_IMAGE_TYPE}/environment.yml" ]; then \ - echo "Installing packages from '/${BASE_IMAGE_TYPE}/environment.yml'" \ - ; conda env update --name base --file "/${BASE_IMAGE_TYPE}/environment.yml" --solver libmamba \ +RUN echo "Checking if environment.yml exists for ${WORKSPACE_TYPE}" \ + ; if [ -f "/${WORKSPACE_TYPE}/environment.yml" ]; then \ + echo "Installing packages from '/${WORKSPACE_TYPE}/environment.yml'" \ + ; conda env update --file "/${WORKSPACE_TYPE}/environment.yml" \ ; else \ - echo "Installing packages from '/shared/environment.yml'" \ - ; conda env update --name base --file "/shared/environment.yml" --solver libmamba \ + sed -i "s/WORKSPACE_ENVIRONMENT_NAME/${WORKSPACE_TYPE}/g" /shared/environment.yml \ + ; echo "Installing packages from '/shared/environment.yml'" \ + ; conda env update --file "/shared/environment.yml" \ ; fi RUN npm install typescript -g -RUN pip install jupyter-server==2.5.0 -RUN pip install jupyter-resource-usage==0.7.2 # Adjust permissions on home directory so writable by group root. RUN chgrp -Rf root /home/$NB_USER && chmod -Rf g+w /home/$NB_USER @@ -85,4 +104,9 @@ COPY ./environments.json $ENVIRONMENTS_FILE_PATH RUN echo 'printf "\e[101mNOTE: This terminal uses the default environment which might not be the same as your notebook.\e[49m\n\n"' >> /etc/profile -ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] +RUN conda list + +# Reset Shell +SHELL ["/bin/sh", "-c"] + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] \ No newline at end of file diff --git a/jupyterlab3/entrypoint.sh b/jupyterlab3/entrypoint.sh index 434b371..2254a59 100644 --- a/jupyterlab3/entrypoint.sh +++ b/jupyterlab3/entrypoint.sh @@ -90,8 +90,8 @@ done # allows `base_url` to be set so that HTTP *responses* include the `base_url` so that browsers make the correct # call. However, it strips out `base_url` when listening for *requests* so that handles the ingress/nginx proxy # requests correctly. -export NOTEBOOKLIBPATH=$(find /opt/conda/lib/ -maxdepth 3 -type d -name "notebook") -export JUPYTERSERVERLIBPATH=$(find /opt/conda/lib -maxdepth 3 -type d -name "jupyter_server") +export NOTEBOOKLIBPATH=$(find /opt/conda/envs/$WORKSPACE_TYPE/lib -maxdepth 3 -type d -name "notebook") +export JUPYTERSERVERLIBPATH=$(find /opt/conda/envs/$WORKSPACE_TYPE/lib -maxdepth 3 -type d -name "jupyter_server") # Fix "fatal: not a git repository" error on startup export GIT_DISCOVERY_ACROSS_FILESYSTEM=1 @@ -123,10 +123,15 @@ fi # Dump all env variables into file so they exist still though SSH env | grep _ >> /etc/environment -# Add conda bin to path -export PATH=$PATH:/opt/conda/bin -cp /root/.bashrc ~/.bash_profile -conda init +# Add workspace env conda bin to path +export PATH=$PATH:/opt/conda/envs/$WORKSPACE_TYPE/bin + +# Set up default conda environment for terminals +echo ". /opt/conda/etc/profile.d/conda.sh ; conda activate $WORKSPACE_TYPE" > /etc/profile.d/init_conda.sh + +# Cleanup ~/.bash_profile +sed -i "s/\. \/opt\/conda\/etc\/profile.d\/conda\.sh//g" ~/.bash_profile +sed -i "s/conda activate base//g" ~/.bash_profile # Need to fix directory permissions for publickey authentication chmod 700 /projects @@ -158,7 +163,7 @@ MEMORY=$(get_max_memory "$NAMESPACE") # TBD maap-py install -source /opt/conda/bin/activate base +source /opt/conda/bin/activate $WORKSPACE_TYPE export SHELL=/bin/bash VERSION=$(jupyter lab --version) if [[ $VERSION > '2' ]] && [[ $VERSION < '3' ]]; then diff --git a/jupyterlab3/isce3/environment.yml b/jupyterlab3/isce3/environment.yml deleted file mode 100644 index ba3be7e..0000000 --- a/jupyterlab3/isce3/environment.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: base -channels: - - conda-forge - - nodefaults -dependencies: - - gitpython=3.1.26 - - ipyleaflet=0.17.2 - - jupyterlab=3.6.3 - - jupyterlab-git=0.34.2 - - jupyter-packaging=0.12.3 - - jupyterlab_widgets=1.0.2 - - nodejs=16.19.0 - - plotly=5.5.0 - - xmltodict=0.13.0 - - pip: - - jupyter-ydoc==0.2.4 diff --git a/jupyterlab3/pangeo/environment.yml b/jupyterlab3/pangeo/environment.yml index 46e3c5b..54d1cd0 100644 --- a/jupyterlab3/pangeo/environment.yml +++ b/jupyterlab3/pangeo/environment.yml @@ -1,28 +1,31 @@ -name: base +name: pangeo channels: - conda-forge - nodefaults dependencies: - - pangeo-notebook=2023.04.15 - - gitpython=3.1.30 - - ipyevents=2.0.1 - - ipyleaflet=0.17.2 + - folium=0.15.1 + - gitpython=3.1.40 + - gh=2.40.1 + - git-lfs=3.4.1 + - ipyevents=2.0.2 + - ipyleaflet=0.18.1 + - ipywidgets=8.0.6 + - jupyter-packaging=0.12.3 - jupyterlab=3.6.3 - jupyterlab-git=0.34.2 - - jupyter-packaging=0.12.3 - jupyterlab_widgets=3.0.7 + - nbstripout=0.6.1 - nodejs=18.15.0 - - plotly=5.14.1 - - pydantic=1.10.8 - - rioxarray=0.14.1 - - shapely=2.0.1 - - xmltodict=0.13.0 - - xarray=2023.5.0 - - pip + - pangeo-notebook=2023.04.15 + - plotly=5.18.0 + - plotnine=0.12.2 + - pydantic=2.5.2 + - xarray_leaflet=0.2.3 + - pip=23.3.2 - pip: - - rio_tiler==4.1.11 - - pystac_client==0.6.1 - - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.5#egg-info=stac_ipyleaflet + - jupyter-resource-usage==0.7.2 + - rio-tiler==6.2.8 + - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.6#egg-info=stac_ipyleaflet variables: TITILER_STAC_ENDPOINT: 'https://titiler-stac.maap-project.org/' TITILER_ENDPOINT: 'https://titiler.maap-project.org/' diff --git a/jupyterlab3/shared/environment.yml b/jupyterlab3/shared/environment.yml index a9d5dba..863796e 100644 --- a/jupyterlab3/shared/environment.yml +++ b/jupyterlab3/shared/environment.yml @@ -1,14 +1,19 @@ -name: base +name: WORKSPACE_ENVIRONMENT_NAME channels: - conda-forge - nodefaults dependencies: - - gitpython=3.1.26 - - ipyleaflet=0.17.2 - - jupyterlab=3.6.1 + - folium=0.15.1 + - gitpython=3.1.40 + - ipyleaflet=0.18.1 + - jupyterlab=3.6.3 - jupyterlab-git=0.34.2 - jupyter-packaging=0.12.3 - - jupyterlab_widgets=1.0.2 - - nodejs=16.14.2 - - plotly=5.5.0 - - xmltodict=0.13.0 \ No newline at end of file + - jupyterlab_widgets=3.0.7 + - nodejs=18.15.0 + - plotly=5.18.0 + - plotnine=0.12.2 + - pip=23.3.2 + - pip: + - jupyter-resource-usage==0.7.2 + - rio-tiler==6.2.8 From 122528e06ddc83ff406ca562067bc7f2d172cb63 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:53:46 -0600 Subject: [PATCH 20/37] Feature/conda forge default (#81) * updated maap help to version 1.0.1 * converted back to 1.0.0 * added in lines that set conda forge as the default and create .condarc * fixed typo --- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- jupyterlab3/docker/Dockerfile | 3 +++ 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index b72cb45..07f0814 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -16,7 +16,7 @@ RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy -# Set the conda environemnt for all subsequent docker RUN commands +# Set the conda environment for all subsequent docker RUN commands # When maap-py is updated and installed via our environment.yml, # we won't need this line unless other envrionment specific commands are added SHELL ["conda", "run", "-n", "isce3", "/bin/bash", "-c"] diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index b59f18a..653d6de 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -13,7 +13,7 @@ RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy -# Set the conda environemnt for all subsequent docker RUN commands +# Set the conda environment for all subsequent docker RUN commands # When maap-py is updated and installed via our environment.yml, # we won't need this line unless other envrionment specific commands are added SHELL ["conda", "run", "-n", "pangeo", "/bin/bash", "-c"] diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 1461106..8f98a98 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -43,7 +43,7 @@ RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy -# Set the conda environemnt for all subsequent docker RUN commands +# Set the conda environment for all subsequent docker RUN commands # When maap-py is updated and installed via our environment.yml, # we won't need this line unless other envrionment specific commands are added SHELL ["conda", "run", "-n", "r", "/bin/bash", "-c"] diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 26e97e6..8b49f89 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -13,7 +13,7 @@ RUN conda env create -y -f "/tmp/environment.yml" \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete \ && /opt/conda/bin/conda clean -afy -# Set the conda environemnt for all subsequent docker RUN commands +# Set the conda environment for all subsequent docker RUN commands # When maap-py is updated and installed via our environment.yml, # we won't need this line unless other envrionment specific commands are added SHELL ["conda", "run", "-n", "vanilla", "/bin/bash", "-c"] diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 9e629fa..00055a2 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -31,6 +31,9 @@ RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd USER root +RUN conda config --system --add channels conda-forge +RUN conda config --system --remove channels defaults + # Install additional libraries required by Python packages which are in # the minimal base image. Also install 'rsync' so the 'oc rsync' command # can be used to copy files into the running container. From f16d6ee13e5a8d80601fbe826674e2320bfd21bd Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:37:18 -0600 Subject: [PATCH 21/37] Feature/missing r package (#83) * updated maap help to version 1.0.1 * converted back to 1.0.0 * added in lines that set conda forge as the default and create .condarc * added r-BiocManager=1.30.22 package * removed sfarrow just for testing * added back in sfarrow package * added arrow package to environment.yml * added r-arrow dependency * removed arrow package and pinned r-arrow * fixed pinned r-arrow version to 14.0.1 * updated version of libpq-dev to avoid build error --- base_images/r/docker/Dockerfile | 2 +- base_images/r/environment.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 8f98a98..1a2e3bd 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -21,7 +21,7 @@ RUN apt-get clean && apt-get update && \ libhdf4-alt-dev=4.2.15-3 \ libhdf5-dev=1.10.6+repack-4+deb11u1 \ libjq-dev=1.6-2.1 \ - libpq-dev=13.13-0+deb11u1 \ + libpq-dev=13.14-0+deb11u1 \ libproj-dev=7.2.1-1 \ libprotobuf-dev=3.12.4-1+deb11u1 \ libnetcdf-dev=1:4.7.4-1 \ diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml index 7a1e13e..41cdb53 100644 --- a/base_images/r/environment.yml +++ b/base_images/r/environment.yml @@ -11,8 +11,10 @@ dependencies: - postgis=3.4.0 - python=3.10.13 - r=4.2 + - r-arrow=14.0.1 - r-aws.s3=0.3.22 - r-base=4.2.3 + - r-BiocManager=1.30.22 - r-broom=1.0.5 - r-car=3.1_2 - r-chron=2.3_61 From ac2820eb3b6b2d15edc4d1fc2d26cd76601af3c5 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Wed, 28 Feb 2024 12:31:47 -0800 Subject: [PATCH 22/37] Add `stac_ipyleaflet` (#84) * Added stac-ipyleaflet to shared environment yaml. * Minor commenting and visual improvements to Makefile --- Makefile | 8 ++++---- jupyterlab3/shared/environment.yml | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 917e8f4..2d87123 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,9 @@ export BASE_IMAGE_NAME = "${PROJECT_PREFIX}base_${IMAGE_NAME}" export JUPYTER_IMAGE_NAME = "${PROJECT_PREFIX}jupyter_${IMAGE_NAME}" export RUN_OPTIONS = -build-images: build-base-image build-jupyter-image +build-images: build-base-image build-jupyter-image ## Build both the base and jupyterlab image -build-images-no-cache: build-base-image-no-cache build-jupyter-image-no-cache +build-images-no-cache: build-base-image-no-cache build-jupyter-image-no-cache ## Build both the base and jupyterlab image without using the docker cache build-base-image: ## Build the base image for the 'vanilla' workspace (default), or the workspace specified by setting the argument, IMAGE_NAME= @cd base_images/${IMAGE_NAME}; \ @@ -46,11 +46,11 @@ help: ## (DEFAULT) This help information @echo ==================================================================== @grep -E '^## .*$$' \ $(MAKEFILE_LIST) \ - | awk 'BEGIN { FS="## " }; {printf "\033[33m%-20s\033[0m \n", $$2}' + | awk 'BEGIN { FS="## " }; {printf "\033[33m%-30s\033[0m \n", $$2}' @echo @grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' \ $(MAKEFILE_LIST) \ - | awk 'BEGIN { FS=":.*?## " }; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' \ + | awk 'BEGIN { FS=":.*?## " }; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' \ # | sort .PHONY: help .DEFAULT_GOAL := help \ No newline at end of file diff --git a/jupyterlab3/shared/environment.yml b/jupyterlab3/shared/environment.yml index 863796e..123970f 100644 --- a/jupyterlab3/shared/environment.yml +++ b/jupyterlab3/shared/environment.yml @@ -17,3 +17,10 @@ dependencies: - pip: - jupyter-resource-usage==0.7.2 - rio-tiler==6.2.8 + - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.6#egg-info=stac_ipyleaflet +variables: + TITILER_STAC_ENDPOINT: 'https://titiler-stac.maap-project.org/' + TITILER_ENDPOINT: 'https://titiler.maap-project.org/' + STAC_CATALOG_NAME: 'MAAP STAC' + STAC_CATALOG_URL: 'https://stac.maap-project.org/' + STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' From bd002223c70b865486849afcc0f632250933dc45 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 28 Feb 2024 16:11:06 -0600 Subject: [PATCH 23/37] Feature/triaged job folder (#88) * updated maap help to version 1.0.1 * converted back to 1.0.0 * added in lines that set conda forge as the default and create .condarc * updated all devfiles to have triaged_job folder * changed instances of triaged_job to triaged-jobs --- devfiles/isce3/devfile/devfile.yaml | 8 ++++++++ devfiles/pangeo/devfile/devfile.yaml | 8 ++++++++ devfiles/r/devfile/devfile.yaml | 8 ++++++++ devfiles/vanilla/devfile/devfile.yaml | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/devfiles/isce3/devfile/devfile.yaml b/devfiles/isce3/devfile/devfile.yaml index 9c4b6ee..565fd6d 100644 --- a/devfiles/isce3/devfile/devfile.yaml +++ b/devfiles/isce3/devfile/devfile.yaml @@ -55,6 +55,10 @@ components: mountPath: /projects/shared-buckets subPath: shared-buckets mountPropagation: HostToContainer + - name: s3fs-volume + mountPath: /projects/triaged-jobs + subPath: triaged-jobs + mountPropagation: HostToContainer - name: s3fs image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always @@ -76,6 +80,10 @@ components: mountPath: /shared-buckets subPath: shared-buckets mountPropagation: Bidirectional + - name: s3fs-volume + mountPath: /triaged-jobs + subPath: triaged-jobs + mountPropagation: Bidirectional - apiVersion: v1 kind: PersistentVolumeClaim metadata: diff --git a/devfiles/pangeo/devfile/devfile.yaml b/devfiles/pangeo/devfile/devfile.yaml index d256bec..9ee8b2e 100644 --- a/devfiles/pangeo/devfile/devfile.yaml +++ b/devfiles/pangeo/devfile/devfile.yaml @@ -55,6 +55,10 @@ components: mountPath: /projects/shared-buckets subPath: shared-buckets mountPropagation: HostToContainer + - name: s3fs-volume + mountPath: /projects/triaged-jobs + subPath: triaged-jobs + mountPropagation: HostToContainer - name: s3fs image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always @@ -76,6 +80,10 @@ components: mountPath: /shared-buckets subPath: shared-buckets mountPropagation: Bidirectional + - name: s3fs-volume + mountPath: /triaged-jobs + subPath: triaged-jobs + mountPropagation: Bidirectional - apiVersion: v1 kind: PersistentVolumeClaim metadata: diff --git a/devfiles/r/devfile/devfile.yaml b/devfiles/r/devfile/devfile.yaml index e23e6ba..a73c6fe 100644 --- a/devfiles/r/devfile/devfile.yaml +++ b/devfiles/r/devfile/devfile.yaml @@ -55,6 +55,10 @@ components: mountPath: /projects/shared-buckets subPath: shared-buckets mountPropagation: HostToContainer + - name: s3fs-volume + mountPath: /projects/triaged-jobs + subPath: triaged-jobs + mountPropagation: HostToContainer - name: s3fs image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always @@ -76,6 +80,10 @@ components: mountPath: /shared-buckets subPath: shared-buckets mountPropagation: Bidirectional + - name: s3fs-volume + mountPath: /triaged-jobs + subPath: triaged-jobs + mountPropagation: Bidirectional - apiVersion: v1 kind: PersistentVolumeClaim metadata: diff --git a/devfiles/vanilla/devfile/devfile.yaml b/devfiles/vanilla/devfile/devfile.yaml index 02280e2..9317ed5 100644 --- a/devfiles/vanilla/devfile/devfile.yaml +++ b/devfiles/vanilla/devfile/devfile.yaml @@ -55,6 +55,10 @@ components: mountPath: /projects/shared-buckets subPath: shared-buckets mountPropagation: HostToContainer + - name: s3fs-volume + mountPath: /projects/triaged-jobs + subPath: triaged-jobs + mountPropagation: HostToContainer - name: s3fs image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always @@ -76,6 +80,10 @@ components: mountPath: /shared-buckets subPath: shared-buckets mountPropagation: Bidirectional + - name: s3fs-volume + mountPath: /triaged-jobs + subPath: triaged-jobs + mountPropagation: Bidirectional - apiVersion: v1 kind: PersistentVolumeClaim metadata: From eb00563ddb70415117f25da366e7ec920a7c9ca4 Mon Sep 17 00:00:00 2001 From: bsatoriu <27687558+bsatoriu@users.noreply.github.com> Date: Wed, 28 Feb 2024 15:53:30 -0800 Subject: [PATCH 24/37] Fix s3fs sidecar image urls (#89) fix s3fs sidecar image Co-authored-by: bsatoriu --- devfiles/edav/devfile/devfile.yaml | 2 +- devfiles/isce2/devfile/devfile.yaml | 2 +- devfiles/isce3/devfile/devfile.yaml | 2 +- devfiles/pangeo/devfile/devfile.yaml | 2 +- devfiles/r/devfile/devfile.yaml | 2 +- devfiles/rgedi/devfile/devfile.yaml | 2 +- devfiles/vanilla/devfile/devfile.yaml | 2 +- jupyterlab3/environments.json | 10 ---------- 8 files changed, 7 insertions(+), 17 deletions(-) diff --git a/devfiles/edav/devfile/devfile.yaml b/devfiles/edav/devfile/devfile.yaml index 89bedf3..6c78aab 100644 --- a/devfiles/edav/devfile/devfile.yaml +++ b/devfiles/edav/devfile/devfile.yaml @@ -56,7 +56,7 @@ components: subPath: shared-buckets mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/isce2/devfile/devfile.yaml b/devfiles/isce2/devfile/devfile.yaml index 06de73b..47bd7d3 100644 --- a/devfiles/isce2/devfile/devfile.yaml +++ b/devfiles/isce2/devfile/devfile.yaml @@ -56,7 +56,7 @@ components: subPath: shared-buckets mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/isce3/devfile/devfile.yaml b/devfiles/isce3/devfile/devfile.yaml index 565fd6d..502a3a1 100644 --- a/devfiles/isce3/devfile/devfile.yaml +++ b/devfiles/isce3/devfile/devfile.yaml @@ -60,7 +60,7 @@ components: subPath: triaged-jobs mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/pangeo/devfile/devfile.yaml b/devfiles/pangeo/devfile/devfile.yaml index 9ee8b2e..b30c43d 100644 --- a/devfiles/pangeo/devfile/devfile.yaml +++ b/devfiles/pangeo/devfile/devfile.yaml @@ -60,7 +60,7 @@ components: subPath: triaged-jobs mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/r/devfile/devfile.yaml b/devfiles/r/devfile/devfile.yaml index a73c6fe..4e14ea3 100644 --- a/devfiles/r/devfile/devfile.yaml +++ b/devfiles/r/devfile/devfile.yaml @@ -60,7 +60,7 @@ components: subPath: triaged-jobs mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/rgedi/devfile/devfile.yaml b/devfiles/rgedi/devfile/devfile.yaml index 8f29b1d..920321d 100644 --- a/devfiles/rgedi/devfile/devfile.yaml +++ b/devfiles/rgedi/devfile/devfile.yaml @@ -56,7 +56,7 @@ components: subPath: shared-buckets mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/devfiles/vanilla/devfile/devfile.yaml b/devfiles/vanilla/devfile/devfile.yaml index 9317ed5..5ced3c3 100644 --- a/devfiles/vanilla/devfile/devfile.yaml +++ b/devfiles/vanilla/devfile/devfile.yaml @@ -60,7 +60,7 @@ components: subPath: triaged-jobs mountPropagation: HostToContainer - name: s3fs - image: 'mas.ops.maap-project.org/root/che-sidecar-s3fs:master' + image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' imagePullPolicy: Always resources: limits: diff --git a/jupyterlab3/environments.json b/jupyterlab3/environments.json index f8d5190..f4047ed 100644 --- a/jupyterlab3/environments.json +++ b/jupyterlab3/environments.json @@ -20,16 +20,6 @@ "workspace_bucket": "maap-uat-workspace", "default_host": false }, - { - "environment": "pilot-ops", - "ade_server": "ade.ops.maap-project.org", - "api_server": "api.ops.maap-project.org", - "auth_server": "auth.ops.maap-project.org", - "mas_server": "mas.ops.maap-project.org", - "edsc_server": "ade.ops.maap-project.org:30052", - "workspace_bucket": "maap-ops-workspace", - "default_host": false - }, { "environment": "ops", "ade_server": "ade.maap-project.org", From c847c5a0dca5ff074fd63ab0feb86104013b970f Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:32:45 -0600 Subject: [PATCH 25/37] Bug/update dps version (#90) * updated maap help to version 1.0.1 * converted back to 1.0.0 * added in lines that set conda forge as the default and create .condarc * increased dps version to 0.5.9 --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 00055a2..d6b230e 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -73,7 +73,7 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements ############################### # Custom Jupyter Extensions ############################### -RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.2 --no-build +RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.9 --no-build # PyPi package prepended with 'maap' so it more easily discoverable RUN pip install maap-jupyter-server-extension==1.2.2 From 23aa4f1ca7955b04c76dcf7816a4dbebfc13107c Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:26:20 -0600 Subject: [PATCH 26/37] Bug/jlab launch error (#94) * manual install for jupyter server extension * changed to npm package of jupyter server extension I published * test pypi install of maap jupyter server extension with jupyter_server version pinned * upgraded version of test pypi package maap jupyter server extension * increased version maap jupyter server extension test pypi after rebuilding the entire extension before publishing * upgraded to 1.2.3 of maap jupyter server extension pypi version * removed comment --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index d6b230e..79dbdce 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -76,7 +76,7 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.9 --no-build # PyPi package prepended with 'maap' so it more easily discoverable -RUN pip install maap-jupyter-server-extension==1.2.2 +RUN pip install maap-jupyter-server-extension==1.2.3 RUN jupyter server extension enable jupyter_server_extension RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0.2.0 --no-build From 73f9d9b8636308505ff2ba0f9b4cc397ddb30317 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Wed, 13 Mar 2024 09:23:31 -0700 Subject: [PATCH 27/37] Add additional packages to Pangeo (#93) Added additional, pinned packages to pangeo base and jupyter lab images. --- base_images/pangeo/environment.yml | 34 +++++++++++++++++++++++++----- jupyterlab3/pangeo/environment.yml | 16 +++++++++++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml index eeecb06..c139768 100644 --- a/base_images/pangeo/environment.yml +++ b/base_images/pangeo/environment.yml @@ -10,6 +10,8 @@ dependencies: - boto3=1.33.13 - bottleneck=1.3.7 - cartopy=0.22.0 + - cdsapi=0.6.1 + - cf_xarray=0.9.0 - cfgrib=0.9.10.4 - cython=3.0.7 - dask-ml=2023.3.24 @@ -20,12 +22,15 @@ dependencies: - eofs=1.4.0 - erddapy=2.2.0 - esmpy=8.4.2 + - fastjmd95=0.2.1 - flox=0.8.6 - fsspec=2023.12.2 - gcm_filters=0.3.0 - gdal=3.7.0 - geocube=0.4.2 + - geogif=0.1.5 - geopandas=0.14.2 + - geopy=2.4.1 - geoviews-core=1.11.0 - h5netcdf=1.3.0 - h5py=3.9.0 @@ -33,35 +38,41 @@ dependencies: - holoviews=1.18.1 - httpx=0.26.0 - hvplot=0.9.1 - - intake=0.7.0 + - intake-esm=2024.2.6 - intake-geopandas=0.4.0 - intake-stac=0.4.0 - intake-xarray=0.7.0 + - intake=0.7.0 - kerchunk=0.2.2 + - line_profiler=4.1.1 - lxml=4.9.3 - lz4=4.3.2 - mapclassify=2.6.1 - matplotlib=3.7.3 + - memory_profiler=0.61.0 + - metpy=1.6.1 - mizani=0.10.0 - mpl-scatter-density=0.7 - nc-time-axis=1.4.1 - netcdf4=1.6.4 - numba=0.58.1 + - numbagg=0.8.0 - numcodecs=0.11.0 - numpy=1.26.3 - odc-stac=0.3.8 - - pandas=2.1.4 - pandarallel=1.6.5 + - pandas=2.1.4 - pyarrow=14.0.1 + - pycamhd=0.7.0 - pycurl=7.45.1 - pydap=3.4.0 - pygeos=0.14 - pyogrio=0.6.0 - pyproj=3.5.0 - - pystac=1.9.0 - pystac-client=0.6.1 - - python=3.10.13 + - pystac=1.9.0 - python-blosc=1.10.6 + - python=3.10.13 - rasterio=1.3.7 - rasterstats=0.19.0 - rechunker=0.5.2 @@ -70,6 +81,7 @@ dependencies: - rioxarray=0.15.0 - rtree=1.1.0 - s3fs=2023.12.2 + - satpy=0.47.0 - scikit-image=0.22.0 - scikit-learn=1.3.2 - scipy=1.11.4 @@ -79,15 +91,27 @@ dependencies: - sparse=0.15.0 - stackstac=0.5.0 - statsmodels=0.14.1 + - tiledb-py=0.19.1 + - timezonefinder=6.4.1 - tqdm=4.66.1 - unidecode=1.3.7 - - xarray=2023.12.0 - xarray-datatree=0.0.13 - xarray-spatial=0.3.5 + - xarray=2023.12.0 - xarrayutils=2.0.0 + - xbatcher=0.3.0 + - xcape=0.1.4 + - xclim=0.46.0 + - xcube=0.9.1 - xesmf=0.8.2 + - xgboost=2.0.3 + - xgcm=0.8.1 - xhistogram=0.3.2 + - xmip=0.7.2 + - xmitgcm=0.5.2 - xmltodict=0.13.0 + - xpublish=0.3.3 + - xrft=1.0.1 - zarr=2.16.1 - pip=23.3.2 - pip: diff --git a/jupyterlab3/pangeo/environment.yml b/jupyterlab3/pangeo/environment.yml index 54d1cd0..2cba7c6 100644 --- a/jupyterlab3/pangeo/environment.yml +++ b/jupyterlab3/pangeo/environment.yml @@ -3,23 +3,33 @@ channels: - conda-forge - nodefaults dependencies: + - black=24.2.0 - folium=0.15.1 - - gitpython=3.1.40 + - gh-scoped-creds=4.1 - gh=2.40.1 - git-lfs=3.4.1 + - gitpython=3.1.40 - ipyevents=2.0.2 - ipyleaflet=0.18.1 + - ipytree=0.2.2 - ipywidgets=8.0.6 - jupyter-packaging=0.12.3 - - jupyterlab=3.6.3 - - jupyterlab-git=0.34.2 + - jupyter-panel-proxy=0.1.0 - jupyterlab_widgets=3.0.7 + - jupyterlab-git=0.34.2 + - jupyterlab-s3-browser=0.12.0 + - jupyterlab=3.6.3 + - nb_conda_kernels=2.3.1 - nbstripout=0.6.1 - nodejs=18.15.0 - pangeo-notebook=2023.04.15 - plotly=5.18.0 - plotnine=0.12.2 - pydantic=2.5.2 + - python-gist=0.10.6 + - python-graphviz=0.20.1 + - rise=5.7.1 + - snakeviz=2.2.0 - xarray_leaflet=0.2.3 - pip=23.3.2 - pip: From d9881a9e1e120368f519106077baf75f9ef6fa32 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:56:27 -0700 Subject: [PATCH 28/37] Awscli bug (#95) * added the groff package to vanilla * added groff to all images * pinned version for groff --- base_images/isce3/environment.yml | 1 + base_images/pangeo/environment.yml | 1 + base_images/r/environment.yml | 1 + base_images/vanilla/environment.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml index f4f1316..5d301d3 100644 --- a/base_images/isce3/environment.yml +++ b/base_images/isce3/environment.yml @@ -11,6 +11,7 @@ dependencies: - fsspec=2023.12.2 - gdal=3.7.0 - geopandas=0.14.1 + - groff=1.22.4 - h5py=3.9.0 - hdf5=1.14.1 - httpx=0.25.2 diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml index c139768..fcce83d 100644 --- a/base_images/pangeo/environment.yml +++ b/base_images/pangeo/environment.yml @@ -32,6 +32,7 @@ dependencies: - geopandas=0.14.2 - geopy=2.4.1 - geoviews-core=1.11.0 + - groff=1.22.4 - h5netcdf=1.3.0 - h5py=3.9.0 - hdf5=1.14.0 diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml index 41cdb53..99d9463 100644 --- a/base_images/r/environment.yml +++ b/base_images/r/environment.yml @@ -6,6 +6,7 @@ channels: dependencies: - awscli=2.14.1 - earthaccess=0.8.2 + - groff=1.22.4 - parallel=20231122 - perl=5.32.1 - postgis=3.4.0 diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml index d89bea8..beabe01 100644 --- a/base_images/vanilla/environment.yml +++ b/base_images/vanilla/environment.yml @@ -12,6 +12,7 @@ dependencies: - gdal=3.7.0 - geocube=0.4.2 - geopandas=0.14.2 + - groff=1.22.4 - h5py=3.9.0 - hdf5=1.14.0 - httpx=0.26.0 From cb5f9e3c5c10ed8e44a848f40f50d1ab36bc1b29 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:57:12 -0700 Subject: [PATCH 29/37] Feature/move rio tiler (#86) * updated maap help to version 1.0.1 * converted back to 1.0.0 * added in lines that set conda forge as the default and create .condarc * added rio tiler to the base image instead of jupyterlab3 image * removed rio tiler from all jupyterlab3 environment.yml and added to base images --- base_images/isce3/environment.yml | 1 + base_images/pangeo/environment.yml | 1 + base_images/r/environment.yml | 1 + base_images/vanilla/environment.yml | 1 + jupyterlab3/pangeo/environment.yml | 1 - jupyterlab3/shared/environment.yml | 3 +-- 6 files changed, 5 insertions(+), 3 deletions(-) diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml index 5d301d3..65d3a61 100644 --- a/base_images/isce3/environment.yml +++ b/base_images/isce3/environment.yml @@ -48,5 +48,6 @@ dependencies: - pip=23.3.2 - pip: - git+https://github.com/opera-adt/RTC.git@v0.3 + - rio-tiler==6.2.8 variables: MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml index fcce83d..07d4c7d 100644 --- a/base_images/pangeo/environment.yml +++ b/base_images/pangeo/environment.yml @@ -117,5 +117,6 @@ dependencies: - pip=23.3.2 - pip: - morecantile==5.1.0 + - rio-tiler==6.2.8 variables: MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml index 99d9463..1255b52 100644 --- a/base_images/r/environment.yml +++ b/base_images/r/environment.yml @@ -107,5 +107,6 @@ dependencies: - pip: - ff==0.0.10 - grid==0.7.1 + - rio-tiler==6.2.8 variables: MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml index beabe01..16f2bf7 100644 --- a/base_images/vanilla/environment.yml +++ b/base_images/vanilla/environment.yml @@ -48,5 +48,6 @@ dependencies: - pip=23.3.2 - pip: - morecantile==5.1.0 + - rio-tiler==6.2.8 variables: MAAP_CONF: '/maap-py/' \ No newline at end of file diff --git a/jupyterlab3/pangeo/environment.yml b/jupyterlab3/pangeo/environment.yml index 2cba7c6..484181e 100644 --- a/jupyterlab3/pangeo/environment.yml +++ b/jupyterlab3/pangeo/environment.yml @@ -34,7 +34,6 @@ dependencies: - pip=23.3.2 - pip: - jupyter-resource-usage==0.7.2 - - rio-tiler==6.2.8 - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.6#egg-info=stac_ipyleaflet variables: TITILER_STAC_ENDPOINT: 'https://titiler-stac.maap-project.org/' diff --git a/jupyterlab3/shared/environment.yml b/jupyterlab3/shared/environment.yml index 123970f..4c79bc9 100644 --- a/jupyterlab3/shared/environment.yml +++ b/jupyterlab3/shared/environment.yml @@ -16,11 +16,10 @@ dependencies: - pip=23.3.2 - pip: - jupyter-resource-usage==0.7.2 - - rio-tiler==6.2.8 - git+https://github.com/MAAP-Project/stac_ipyleaflet.git@0.3.6#egg-info=stac_ipyleaflet variables: TITILER_STAC_ENDPOINT: 'https://titiler-stac.maap-project.org/' TITILER_ENDPOINT: 'https://titiler.maap-project.org/' STAC_CATALOG_NAME: 'MAAP STAC' STAC_CATALOG_URL: 'https://stac.maap-project.org/' - STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' + STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' \ No newline at end of file From 773f75124dc5471343962d9284e48d9a16aa1d6b Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Wed, 13 Mar 2024 14:28:38 -0700 Subject: [PATCH 30/37] Removed ability to build and launch ISCE2 and RGEDI images/workspaces. (#96) Removed ability to build ISCE2 and RGEDI images. --- base_images/build-image.sh | 2 +- base_images/isce2/docker/Dockerfile | 47 -------------- base_images/rgedi/docker/Dockerfile | 27 -------- devfiles/index_example.json | 15 ----- devfiles/isce2/devfile/devfile.yaml | 95 ---------------------------- devfiles/isce2/devfile/isce.png | Bin 79233 -> 0 bytes devfiles/isce2/devfile/meta.yaml | 6 -- devfiles/rgedi/devfile/devfile.yaml | 95 ---------------------------- devfiles/rgedi/devfile/meta.yaml | 6 -- devfiles/rgedi/devfile/r.png | Bin 32553 -> 0 bytes 10 files changed, 1 insertion(+), 292 deletions(-) delete mode 100644 base_images/isce2/docker/Dockerfile delete mode 100644 base_images/rgedi/docker/Dockerfile delete mode 100644 devfiles/isce2/devfile/devfile.yaml delete mode 100644 devfiles/isce2/devfile/isce.png delete mode 100644 devfiles/isce2/devfile/meta.yaml delete mode 100644 devfiles/rgedi/devfile/devfile.yaml delete mode 100644 devfiles/rgedi/devfile/meta.yaml delete mode 100644 devfiles/rgedi/devfile/r.png diff --git a/base_images/build-image.sh b/base_images/build-image.sh index 16b1bdd..c0c2aa5 100755 --- a/base_images/build-image.sh +++ b/base_images/build-image.sh @@ -4,7 +4,7 @@ set -ex base_image_dir=$(dirname $0) # Check if on a branch or in a detached HEAD state get commit sha BRANCH=$(basename $(git symbolic-ref -q --short HEAD || git rev-parse --short HEAD)) -DIRS="vanilla r rgedi rsgislib" +DIRS="vanilla isce3 pangeo r" if [[ ! -z "$@" ]]; then DIRS=$@ fi diff --git a/base_images/isce2/docker/Dockerfile b/base_images/isce2/docker/Dockerfile deleted file mode 100644 index 5d12e23..0000000 --- a/base_images/isce2/docker/Dockerfile +++ /dev/null @@ -1,47 +0,0 @@ -FROM continuumio/miniconda3:22.11.1 -ENV LANG en_US.UTF-8 -ENV TZ US/Pacific -ARG DEBIAN_FRONTEND=noninteractive - -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - -RUN set -ex \ - && apt-get update \ - && apt-get install -y \ - libfftw3-3=3.3.8-2 \ - libgdal28=3.2.2+dfsg-2+deb11u2 \ - libhdf4-0=4.2.15-3 \ - libhdf5-103=1.10.6+repack-4+deb11u1 \ - libopencv-core4.5=4.5.1+dfsg-5 \ - libopencv-highgui4.5=4.5.1+dfsg-5 \ - libopencv-imgproc4.5=4.5.1+dfsg-5 \ - python3-gdal=3.2.2+dfsg-2+deb11u2 \ - python3-h5py=2.10.0-9 \ - python3-numpy=1:1.19.5-1 \ - python3-scipy=1.6.0-2 && \ - apt-get clean - - -RUN mkdir /projects -WORKDIR /projects -RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd - -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba - -# need to uninstall jupyter_server_terminals as it conflicts with Jupyterlab 3.4.x. Doesn't seem to break anything -# but can get rid of if/when we upgrade jlab -RUN conda install -y --solver=libmamba -c conda-forge -c plant plant=0.1.89dev isce2=2.6.2 matplotlib=3.6.2 Cython=0.29.33 \ - numba=0.56.4 pygeos=0.14 pyproj=3.4.1 rasterio=1.3.4 && \ - pip uninstall -y jupyter_server_terminals && \ - find /opt/conda/ -follow -type f -name '*.a' -delete && \ - find /opt/conda/ -follow -type f -name '*.js.map' -delete && \ - /opt/conda/bin/conda clean -afy - -ARG IMAGE_REF -ENV DOCKERIMAGE_PATH=${IMAGE_REF} diff --git a/base_images/rgedi/docker/Dockerfile b/base_images/rgedi/docker/Dockerfile deleted file mode 100644 index 14d2734..0000000 --- a/base_images/rgedi/docker/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM continuumio/miniconda3:4.12.0 - -# install maap-py library -ENV MAAP_CONF='/maap-py/' -RUN git clone --single-branch --branch v3.1.3 https://github.com/MAAP-Project/maap-py.git \ - && cd maap-py \ - && pip install -e . - -RUN mkdir /projects -WORKDIR /projects -RUN sed -i -e 's/\/root/\/projects/g' /etc/passwd && echo "source activate r-with-gdal" > ~/.bashrc -RUN apt-get update && apt-get install -y libxt-dev && apt-get clean - -RUN conda install -y -c conda-forge pyOpenSSL=23.2.0 && \ - conda install -y -n base conda-libmamba-solver=23.7.0 && \ - conda config --system --set solver libmamba - -RUN conda install -y --solver=libmamba -c conda-forge nb_conda_kernels - -RUN conda create --name r-with-gdal --solver=libmamba -c conda-forge -c r -c csdms-stack gdal r-rgdal r-sf r-irkernel r-gridExtra r-tidyverse \ - r-randomForest r-raster r-data.table r-rlist r-gdalutils r-stringr r-devtools sysroot_linux-64=2.17 gcc r-lwgeom szip --yes && \ - /opt/conda/bin/conda clean -afy -RUN mkdir -p ~/.R/ && echo "LDFLAGS=-lproj" >> ~/.R/Makevars && \ - conda run --no-capture-output -n r-with-gdal Rscript -e "devtools::install_git('https://github.com/carlos-alberto-silva/rGEDI', dependencies=TRUE)" - -ARG IMAGE_REF -ENV DOCKERIMAGE_PATH=${IMAGE_REF} diff --git a/devfiles/index_example.json b/devfiles/index_example.json index 6747331..4e94f71 100644 --- a/devfiles/index_example.json +++ b/devfiles/index_example.json @@ -28,21 +28,6 @@ "self": "/devfiles/maap-vanilla/devfile_2.0.yaml" } }, - { - "displayName": "MAAP RGEDI Stable", - "description": "Latest version of MAAP RGEDI", - "tags": [ - "JupyterLab", - "Python", - "R", - "MAAP" - ], - "icon": "/images/r.png", - "globalMemoryLimit": "2710Mi", - "links": { - "self": "/devfiles/rgedi/devfile.yaml" - } - }, { "displayName": "MAAP ESA EDAV", "description": "Latest version of MAAP ESA EDAV", diff --git a/devfiles/isce2/devfile/devfile.yaml b/devfiles/isce2/devfile/devfile.yaml deleted file mode 100644 index 47bd7d3..0000000 --- a/devfiles/isce2/devfile/devfile.yaml +++ /dev/null @@ -1,95 +0,0 @@ -apiVersion: 1.0.0 -metadata: - generateName: isce2- -attributes: - editorFree: 'true' -components: - - endpoints: - - attributes: - type: ide - discoverable: 'false' - path: / - public: 'true' - protocol: http - name: jupyter - port: 3100 - referenceContent: | - kind: List - items: - - apiVersion: v1 - kind: Pod - metadata: - name: ws - labels: - ssh: enabled - spec: - volumes: - - name: ws-pvc - persistentVolumeClaim: - claimName: ws - - name: s3fs-volume - emptyDir: {} - containers: - - name: jupyter - image: 'mas.dit.maap-project.org/root/maap-workspaces/jupyterlab3/isce2:develop' - imagePullPolicy: Always - resources: - limits: - memory: 8096Mi - volumeMounts: - - name: ws-pvc - mountPath: /projects - subPath: projects - - name: s3fs-volume - mountPath: /projects/.jupyter - subPath: dotjupyter - - name: s3fs-volume - mountPath: /projects/my-private-bucket - subPath: my-private-bucket - mountPropagation: HostToContainer - - name: s3fs-volume - mountPath: /projects/my-public-bucket - subPath: my-public-bucket - mountPropagation: HostToContainer - - name: s3fs-volume - mountPath: /projects/shared-buckets - subPath: shared-buckets - mountPropagation: HostToContainer - - name: s3fs - image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' - imagePullPolicy: Always - resources: - limits: - memory: 256Mi - securityContext: - privileged: true - volumeMounts: - - name: s3fs-volume - mountPath: /my-public-bucket - subPath: my-public-bucket - mountPropagation: Bidirectional - - name: s3fs-volume - mountPath: /my-private-bucket - subPath: my-private-bucket - mountPropagation: Bidirectional - - name: s3fs-volume - mountPath: /shared-buckets - subPath: shared-buckets - mountPropagation: Bidirectional - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: ws - spec: - storageClassName: nfs-client-che - - apiVersion: v1 - kind: Service - metadata: - generateName: sshport- - spec: - type: NodePort - ports: - - port: 22 - selector: - ssh: enabled - type: kubernetes diff --git a/devfiles/isce2/devfile/isce.png b/devfiles/isce2/devfile/isce.png deleted file mode 100644 index a7f985983e9049c3e85c43a934087c7f534f5ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79233 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 P00000NkvXXu0mjf)nBI4 diff --git a/devfiles/isce2/devfile/meta.yaml b/devfiles/isce2/devfile/meta.yaml deleted file mode 100644 index 200158c..0000000 --- a/devfiles/isce2/devfile/meta.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -displayName: "MAAP ISCE2/PLAnT" -description: Latest version of MAAP ISCE2/PLAnT -tags: ["JupyterLab", "Python", "MAAP", "ISCE2", "PLAnT"] -icon: /devfiles/isce2/devfile/isce.png -globalMemoryLimit: 2710Mi diff --git a/devfiles/rgedi/devfile/devfile.yaml b/devfiles/rgedi/devfile/devfile.yaml deleted file mode 100644 index 920321d..0000000 --- a/devfiles/rgedi/devfile/devfile.yaml +++ /dev/null @@ -1,95 +0,0 @@ -apiVersion: 1.0.0 -metadata: - generateName: rgedi- -attributes: - editorFree: 'true' -components: - - endpoints: - - attributes: - type: ide - discoverable: 'false' - path: / - public: 'true' - protocol: http - name: jupyter - port: 3100 - referenceContent: | - kind: List - items: - - apiVersion: v1 - kind: Pod - metadata: - name: ws - labels: - ssh: enabled - spec: - volumes: - - name: ws-pvc - persistentVolumeClaim: - claimName: ws - - name: s3fs-volume - emptyDir: {} - containers: - - name: jupyter - image: 'mas.dit.maap-project.org/root/maap-workspaces/jupyterlab3/rgedi:develop' - imagePullPolicy: Always - resources: - limits: - memory: 8096Mi - volumeMounts: - - name: ws-pvc - mountPath: /projects - subPath: projects - - name: s3fs-volume - mountPath: /projects/.jupyter - subPath: dotjupyter - - name: s3fs-volume - mountPath: /projects/my-private-bucket - subPath: my-private-bucket - mountPropagation: HostToContainer - - name: s3fs-volume - mountPath: /projects/my-public-bucket - subPath: my-public-bucket - mountPropagation: HostToContainer - - name: s3fs-volume - mountPath: /projects/shared-buckets - subPath: shared-buckets - mountPropagation: HostToContainer - - name: s3fs - image: 'mas.dit.maap-project.org/root/che-sidecar-s3fs:master' - imagePullPolicy: Always - resources: - limits: - memory: 256Mi - securityContext: - privileged: true - volumeMounts: - - name: s3fs-volume - mountPath: /my-public-bucket - subPath: my-public-bucket - mountPropagation: Bidirectional - - name: s3fs-volume - mountPath: /my-private-bucket - subPath: my-private-bucket - mountPropagation: Bidirectional - - name: s3fs-volume - mountPath: /shared-buckets - subPath: shared-buckets - mountPropagation: Bidirectional - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: ws - spec: - storageClassName: nfs-client-che - - apiVersion: v1 - kind: Service - metadata: - generateName: sshport- - spec: - type: NodePort - ports: - - port: 22 - selector: - ssh: enabled - type: kubernetes diff --git a/devfiles/rgedi/devfile/meta.yaml b/devfiles/rgedi/devfile/meta.yaml deleted file mode 100644 index a6adeaf..0000000 --- a/devfiles/rgedi/devfile/meta.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -displayName: "MAAP RGEDI Stable" -description: Latest version of MAAP RGEDI -tags: ["Python", "R", "JupyterLab", "MAAP"] -icon: /devfiles/rgedi/devfile/r.png -globalMemoryLimit: 2710Mi diff --git a/devfiles/rgedi/devfile/r.png b/devfiles/rgedi/devfile/r.png deleted file mode 100644 index bcbd6df404e1486538e4d12fd9d06cf38b30ca5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32553 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 Date: Fri, 15 Mar 2024 10:00:20 -0700 Subject: [PATCH 31/37] Feature/update maap help (#97) added maap help jupyter extension install to pip and v1.2.2=1 --- jupyterlab3/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 79dbdce..e2574ce 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -84,7 +84,7 @@ RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 -- RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-help-jupyter-extension@1.0.1 --no-build +RUN pip install maap-help-jupyter-extension==1.2.1 RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build RUN jupyter lab build && \ From 1fe5e04de797dbb5a98c65fd138818fb107a4727 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:42:17 -0700 Subject: [PATCH 32/37] Feature/update s3fs (#98) updated s3fs to 2023.12.2 --- base_images/isce3/environment.yml | 2 +- base_images/vanilla/environment.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml index 65d3a61..9bfbda6 100644 --- a/base_images/isce3/environment.yml +++ b/base_images/isce3/environment.yml @@ -34,7 +34,7 @@ dependencies: - requests=2.31.0 - rio-cogeo=5.1.0 - rtree=1.1.0 - - s3fs=0.4.2 + - s3fs=2023.12.2 - scikit-learn=1.3.2 - scipy=1.11.4 - seaborn=0.13.0 diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml index 16f2bf7..c5ac6ce 100644 --- a/base_images/vanilla/environment.yml +++ b/base_images/vanilla/environment.yml @@ -35,7 +35,7 @@ dependencies: - requests=2.31.0 - rio-cogeo=5.1.1 - rtree=1.1.0 - - s3fs=0.4.2 + - s3fs=2023.12.2 - scikit-learn=1.3.2 - scipy=1.11.4 - seaborn=0.13.1 From 5210ca3db14adac581e9d97caf902218a9f694d8 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:41:52 -0700 Subject: [PATCH 33/37] Bug/resolve merge conflicts (#101) * fixed merge conflicts * finished fixing merge conflicts * merge conflicts makefile --- jupyterlab3/docker/Dockerfile | 19 +++++++++---------- jupyterlab3/shared/environment.yml | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index e2574ce..386ff4b 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -73,19 +73,18 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements ############################### # Custom Jupyter Extensions ############################### -RUN jupyter labextension install @maap-jupyterlab/dps-jupyter-extension@0.5.9 --no-build -# PyPi package prepended with 'maap' so it more easily discoverable -RUN pip install maap-jupyter-server-extension==1.2.3 +# PyPi packages prepended with 'maap' so they are more easily discoverable +RUN pip install maap-jupyter-server-extension==1.3.0 RUN jupyter server extension enable jupyter_server_extension -RUN jupyter labextension install @maap-jupyterlab/algorithms_jupyter_extension@0.2.0 --no-build -RUN jupyter labextension install @maap-jupyterlab/umf-jupyter-extension@1.0.0 --no-build -RUN jupyter labextension install @maap-jupyterlab/maap-libs-jupyter-extension@1.0.2 --no-build -RUN jupyter labextension install @maap-jupyterlab/edsc-jupyter-extension@1.0.4 --no-build -RUN jupyter labextension install @maap-jupyterlab/user-workspace-management-jupyter-extension@0.0.5 --no-build -RUN pip install maap-help-jupyter-extension==1.2.1 -RUN jupyter labextension install @maap-jupyterlab/che-sidebar-visibility-jupyter-extension@1.0.1 --no-build +RUN pip install maap-dps-jupyter-extension==0.7.0 +RUN pip install maap-algorithms-jupyter-extension==0.3.0 +RUN pip install maap-libs-jupyter-extension==1.2.0 +RUN pip install maap-edsc-jupyter-extension==1.1.0 +RUN pip install maap-user-workspace-management-jupyter-extension==0.1.0 +RUN pip install maap-help-jupyter-extension==1.3.1 +RUN pip install maap-che-sidebar-visibility-jupyter-extension==1.1.0 RUN jupyter lab build && \ jupyter lab clean && \ diff --git a/jupyterlab3/shared/environment.yml b/jupyterlab3/shared/environment.yml index 4c79bc9..32f3862 100644 --- a/jupyterlab3/shared/environment.yml +++ b/jupyterlab3/shared/environment.yml @@ -22,4 +22,4 @@ variables: TITILER_ENDPOINT: 'https://titiler.maap-project.org/' STAC_CATALOG_NAME: 'MAAP STAC' STAC_CATALOG_URL: 'https://stac.maap-project.org/' - STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' \ No newline at end of file + STAC_BROWSER_URL: 'https://stac-browser.maap-project.org/' From 42660cc82046218e22d14f07fa69389bb2ddf536 Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:00:18 -0700 Subject: [PATCH 34/37] upgrade maap-py to v3.1.5 (#102) --- base_images/isce3/docker/Dockerfile | 2 +- base_images/pangeo/docker/Dockerfile | 2 +- base_images/r/docker/Dockerfile | 2 +- base_images/vanilla/docker/Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/base_images/isce3/docker/Dockerfile b/base_images/isce3/docker/Dockerfile index 07f0814..a275edd 100644 --- a/base_images/isce3/docker/Dockerfile +++ b/base_images/isce3/docker/Dockerfile @@ -22,7 +22,7 @@ RUN conda env create -y -f "/tmp/environment.yml" \ SHELL ["conda", "run", "-n", "isce3", "/bin/bash", "-c"] RUN mkdir /maap-py \ - && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && git clone --single-branch --branch v3.1.5 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ && pip install -e /maap-py/ RUN conda list diff --git a/base_images/pangeo/docker/Dockerfile b/base_images/pangeo/docker/Dockerfile index 653d6de..fcf6fae 100644 --- a/base_images/pangeo/docker/Dockerfile +++ b/base_images/pangeo/docker/Dockerfile @@ -20,7 +20,7 @@ SHELL ["conda", "run", "-n", "pangeo", "/bin/bash", "-c"] # Install maap-py library RUN mkdir /maap-py \ - && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && git clone --single-branch --branch v3.1.5 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ && pip install -e /maap-py/ RUN conda list diff --git a/base_images/r/docker/Dockerfile b/base_images/r/docker/Dockerfile index 1a2e3bd..3c9d8b4 100644 --- a/base_images/r/docker/Dockerfile +++ b/base_images/r/docker/Dockerfile @@ -54,7 +54,7 @@ RUN /scripts/install_cran_packages_r.sh # Install maap-py library RUN mkdir /maap-py \ - && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && git clone --single-branch --branch v3.1.5 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ && pip install -e /maap-py/ RUN conda list diff --git a/base_images/vanilla/docker/Dockerfile b/base_images/vanilla/docker/Dockerfile index 8b49f89..2175387 100644 --- a/base_images/vanilla/docker/Dockerfile +++ b/base_images/vanilla/docker/Dockerfile @@ -20,7 +20,7 @@ SHELL ["conda", "run", "-n", "vanilla", "/bin/bash", "-c"] # Install maap-py library RUN mkdir /maap-py \ - && git clone --single-branch --branch v3.1.4 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ + && git clone --single-branch --branch v3.1.5 https://github.com/MAAP-Project/maap-py.git /maap-py/ \ && pip install -e /maap-py/ RUN conda list From 39a05b4555f898bc208ffc07a73b056494c6918a Mon Sep 17 00:00:00 2001 From: bsatoriu <27687558+bsatoriu@users.noreply.github.com> Date: Tue, 26 Mar 2024 11:49:20 -0700 Subject: [PATCH 35/37] Update devfile metadata (#103) --- devfiles/isce3/devfile/meta.yaml | 2 +- devfiles/pangeo/devfile/meta.yaml | 2 +- devfiles/r/devfile/meta.yaml | 2 +- devfiles/vanilla/devfile/meta.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/devfiles/isce3/devfile/meta.yaml b/devfiles/isce3/devfile/meta.yaml index 46ed876..c5c3ac9 100644 --- a/devfiles/isce3/devfile/meta.yaml +++ b/devfiles/isce3/devfile/meta.yaml @@ -1,6 +1,6 @@ --- displayName: "MAAP ISCE3" -description: Latest version of MAAP ISCE3 +description: "MAAP ISCE3 Version: 3.1.5" tags: ["JupyterLab", "Python", "MAAP", "ISCE3"] icon: /devfiles/isce3/devfile/isce.png globalMemoryLimit: 2710Mi diff --git a/devfiles/pangeo/devfile/meta.yaml b/devfiles/pangeo/devfile/meta.yaml index 6b4dd28..c0e8f90 100644 --- a/devfiles/pangeo/devfile/meta.yaml +++ b/devfiles/pangeo/devfile/meta.yaml @@ -1,6 +1,6 @@ --- displayName: "Pangeo" -description: "Version: 2023.04.15" +description: "MAAP Pangeo version: 3.1.5" tags: ["Pangeo", "JupyterLab", "MAAP"] icon: /devfiles/pangeo/devfile/pangeo_simple_logo.svg globalMemoryLimit: 2710Mi diff --git a/devfiles/r/devfile/meta.yaml b/devfiles/r/devfile/meta.yaml index 0df23cd..f4f2b86 100644 --- a/devfiles/r/devfile/meta.yaml +++ b/devfiles/r/devfile/meta.yaml @@ -1,6 +1,6 @@ --- displayName: "MAAP R Stable" -description: Latest version of MAAP R +description: "MAAP R version: 3.1.5" tags: ["Python", "R", "JupyterLab", "MAAP"] icon: /devfiles/r/devfile/r.png globalMemoryLimit: 2710Mi diff --git a/devfiles/vanilla/devfile/meta.yaml b/devfiles/vanilla/devfile/meta.yaml index 5ddab6f..54d84b0 100644 --- a/devfiles/vanilla/devfile/meta.yaml +++ b/devfiles/vanilla/devfile/meta.yaml @@ -1,6 +1,6 @@ --- displayName: "Basic Stable" -description: Latest version of MAAP Basic +description: "MAAP vanilla version: 3.1.5" tags: ["JupyterLab", "Python", "MAAP"] icon: /devfiles/vanilla/devfile/jupyter.png globalMemoryLimit: 2710Mi From 31ce77ea67c00db9eba8d8e75ca7bef0f23f4d0d Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:20:49 -0700 Subject: [PATCH 36/37] Bug/missing maap cfg (#104) * changed maap-py to be using branch commenting out check for maap.cfg * switched back to v3.1.5 and removed MAAP_CONF * removed conda lists --- base_images/isce3/environment.yml | 4 +--- base_images/pangeo/environment.yml | 4 +--- base_images/r/environment.yml | 4 +--- base_images/vanilla/environment.yml | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml index 9bfbda6..4e69d66 100644 --- a/base_images/isce3/environment.yml +++ b/base_images/isce3/environment.yml @@ -48,6 +48,4 @@ dependencies: - pip=23.3.2 - pip: - git+https://github.com/opera-adt/RTC.git@v0.3 - - rio-tiler==6.2.8 -variables: - MAAP_CONF: '/maap-py/' \ No newline at end of file + - rio-tiler==6.2.8 \ No newline at end of file diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml index 07d4c7d..c3b9d0e 100644 --- a/base_images/pangeo/environment.yml +++ b/base_images/pangeo/environment.yml @@ -117,6 +117,4 @@ dependencies: - pip=23.3.2 - pip: - morecantile==5.1.0 - - rio-tiler==6.2.8 -variables: - MAAP_CONF: '/maap-py/' \ No newline at end of file + - rio-tiler==6.2.8 \ No newline at end of file diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml index 1255b52..7461d3d 100644 --- a/base_images/r/environment.yml +++ b/base_images/r/environment.yml @@ -107,6 +107,4 @@ dependencies: - pip: - ff==0.0.10 - grid==0.7.1 - - rio-tiler==6.2.8 -variables: - MAAP_CONF: '/maap-py/' \ No newline at end of file + - rio-tiler==6.2.8 \ No newline at end of file diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml index c5ac6ce..6798810 100644 --- a/base_images/vanilla/environment.yml +++ b/base_images/vanilla/environment.yml @@ -48,6 +48,4 @@ dependencies: - pip=23.3.2 - pip: - morecantile==5.1.0 - - rio-tiler==6.2.8 -variables: - MAAP_CONF: '/maap-py/' \ No newline at end of file + - rio-tiler==6.2.8 \ No newline at end of file From e130a0bb514a308c6b4600530e809051d8ddc24c Mon Sep 17 00:00:00 2001 From: Grace Llewellyn <114033465+grallewellyn@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:26:29 -0700 Subject: [PATCH 37/37] Bug/maap py dependency errors (#106) * changed maap-py to be using branch commenting out check for maap.cfg * switched back to v3.1.5 and removed MAAP_CONF * added dependencies from installing maap-py first * merged in Brians errors and testing vanilla by pinning boto3 in maap-py and making awscli=2.15.0 * only pinning minor version for awscli vanilla * testing fix that solved vanilla aiobotocore error * try upgrading awscli to 2.14.6 * upgraded awscli for isce3 to 2.14.6 * isce3 awscli to 2.14.5 * awscli 2.14.6 and unpinned most other package versions * pinned back all vanilla versions but awscli 2.14.2 * changed all maap-py branches to bug/unpinned-versions and boto3 versions to 1.34.41 * added maap-py var back into isce3 and cleaned up some conda lists * added boto3 to r image * added in jupyter server extension so correctly testing pinning xmltodict * installing jupyter server extension 1.3.4 * removed extra conda lists and changed to maap-py version v3.1.5 --- base_images/isce3/environment.yml | 2 +- base_images/pangeo/environment.yml | 2 +- base_images/r/environment.yml | 1 + base_images/vanilla/environment.yml | 2 +- jupyterlab3/docker/Dockerfile | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/base_images/isce3/environment.yml b/base_images/isce3/environment.yml index 4e69d66..7e7bb01 100644 --- a/base_images/isce3/environment.yml +++ b/base_images/isce3/environment.yml @@ -5,7 +5,7 @@ channels: dependencies: - awscli=2.14.1 - backoff=2.2.1 - - boto3=1.34.3 + - boto3=1.34.41 - cython=3.0.7 - earthengine-api=0.1.384 - fsspec=2023.12.2 diff --git a/base_images/pangeo/environment.yml b/base_images/pangeo/environment.yml index c3b9d0e..4d3326d 100644 --- a/base_images/pangeo/environment.yml +++ b/base_images/pangeo/environment.yml @@ -7,7 +7,7 @@ dependencies: - backoff=2.2.1 - basemap=1.3.7 - bokeh=3.3.3 - - boto3=1.33.13 + - boto3=1.34.41 - bottleneck=1.3.7 - cartopy=0.22.0 - cdsapi=0.6.1 diff --git a/base_images/r/environment.yml b/base_images/r/environment.yml index 7461d3d..6685bae 100644 --- a/base_images/r/environment.yml +++ b/base_images/r/environment.yml @@ -5,6 +5,7 @@ channels: - nodefaults dependencies: - awscli=2.14.1 + - boto3=1.34.41 - earthaccess=0.8.2 - groff=1.22.4 - parallel=20231122 diff --git a/base_images/vanilla/environment.yml b/base_images/vanilla/environment.yml index 6798810..d5f7b83 100644 --- a/base_images/vanilla/environment.yml +++ b/base_images/vanilla/environment.yml @@ -6,7 +6,7 @@ dependencies: - awscli=2.14.1 - backoff=2.2.1 - basemap=1.3.7 - - boto3=1.34.15 + - boto3=1.34.41 - cython=3.0.7 - earthengine-api=0.1.384 - gdal=3.7.0 diff --git a/jupyterlab3/docker/Dockerfile b/jupyterlab3/docker/Dockerfile index 386ff4b..af2f2d5 100644 --- a/jupyterlab3/docker/Dockerfile +++ b/jupyterlab3/docker/Dockerfile @@ -75,7 +75,7 @@ RUN jupyter labextension disable @jupyterlab/apputils-extension:announcements ############################### # PyPi packages prepended with 'maap' so they are more easily discoverable -RUN pip install maap-jupyter-server-extension==1.3.0 +RUN pip install maap-jupyter-server-extension==1.3.4 RUN jupyter server extension enable jupyter_server_extension RUN pip install maap-dps-jupyter-extension==0.7.0