Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
cdcad15
Merge pull request #83 from unity-sds/main
wphyojpl Dec 9, 2024
4ec08c9
feat: Coginto class Update (#84)
wphyojpl Dec 9, 2024
14904da
chore: update version + change log (#85)
github-actions[bot] Dec 9, 2024
313e481
feat: S3 delete (#86)
wphyojpl Dec 16, 2024
fedb70f
chore: update version + change log (#87)
github-actions[bot] Dec 16, 2024
42d1340
fix: Check bbox in Granules STAC (#88)
wphyojpl Jan 8, 2025
1f2b987
chore: update version + change log (#89)
github-actions[bot] Jan 8, 2025
9d51fb5
fix: Poetry error requires project.name (#90)
wphyojpl Jan 9, 2025
f9a0ef8
chore: update version + change log (#91)
github-actions[bot] Jan 9, 2025
a595a42
feat: Allow Es connection with no ssl for demo purposes ONLY (#92)
wphyojpl Jan 17, 2025
8c1b092
chore: update version + change log (#93)
github-actions[bot] Jan 17, 2025
826eedc
feat: DS Client Library (#94)
wphyojpl Feb 10, 2025
a7211c8
chore: update version + change log (#95)
github-actions[bot] Feb 10, 2025
3b48ac0
fix: Client updates (#98)
wphyojpl Mar 4, 2025
cf9af6e
chore: update version + change log (#99)
github-actions[bot] Mar 4, 2025
8a1b089
feat: new Client CLI methods (#100)
wphyojpl Mar 24, 2025
dd90348
chore: update version + change log (#101)
github-actions[bot] Mar 24, 2025
976b05b
feat: Item transfomer (#102)
wphyojpl Apr 7, 2025
7d8439e
chore: update version + change log (#103)
github-actions[bot] Apr 7, 2025
d0b5a09
feat: using single Collection endpoint to retrieve the collection det…
wphyojpl Apr 9, 2025
ec8ba60
chore: update version + change log (#105)
github-actions[bot] Apr 9, 2025
075defc
fix: case insensitivity (#106)
wphyojpl Apr 24, 2025
9b75406
chore: update version + change log (#107)
github-actions[bot] Apr 24, 2025
3f3ba3a
fix: Stage out error (#108)
wphyojpl May 13, 2025
c2f1d35
chore: update version + change log (#109)
github-actions[bot] May 13, 2025
d81bf0c
feat: Allow SNS to set external roles to publish messages (#110)
wphyojpl May 21, 2025
c05a1ee
chore: update version + change log (#111)
github-actions[bot] May 21, 2025
e1f96df
chore: Unit Client updates (#112)
wphyojpl Jun 3, 2025
be12ca7
chore: update version + change log (#113)
github-actions[bot] Jun 3, 2025
4451600
feat: stage-out MAAP use case (#114)
wphyojpl Aug 21, 2025
348f7d3
chore: update version + change log (#115)
github-actions[bot] Sep 9, 2025
b0b1cb1
feat: Using opensearch instead of elasticsearch (#116)
wphyojpl Sep 9, 2025
9a4b308
chore: update version + change log (#117)
github-actions[bot] Sep 9, 2025
18c0daf
feat: Dist utils is obsolete. Replace with shutil (#118)
wphyojpl Sep 24, 2025
02e7e65
chore: update version + change log (#119)
github-actions[bot] Sep 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ __pycache__
.terraform.lock.hcl
terraform.tf
terraform.tfvars
cumulus_lambda_functions_deployment.zip
cumulus_lambda_functions_deployment.zip
examples/**/*
68 changes: 68 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,74 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

===================================================================

## [1.1.1.dev001100] - 2025-09-24
### Changed
- [#118](https://github.com/unity-sds/mdps-ds-lib/pull/118) feat: dist utils is obsolete. replace with shutil

## [1.1.1.dev001000] - 2025-09-09
### Changed
- [#116](https://github.com/unity-sds/mdps-ds-lib/pull/116) feat: using opensearch instead of elasticsearch

## [1.1.1.dev000900] - 2025-08-21
### Changed
- [#114](https://github.com/unity-sds/mdps-ds-lib/pull/114) feat: stage-out maap use case

## [1.1.1.dev000801] - 2025-06-03
### Fixed
- [#112](https://github.com/unity-sds/mdps-ds-lib/pull/112) chore: unit client updates

## [1.1.1.dev000800] - 2025-05-21
### Changed
- [#110](https://github.com/unity-sds/mdps-ds-lib/pull/110) feat: allow sns to set external roles to publish messages

## [1.1.1.dev000702] - 2025-05-13
### Fixed
- [#108](https://github.com/unity-sds/mdps-ds-lib/pull/108) fix: stage out error

## [1.1.1.dev000701] - 2025-04-24
### Fixed
- [#106](https://github.com/unity-sds/mdps-ds-lib/pull/106) fix: case insensitivity

## [1.1.1.dev000700] - 2025-04-09
### Changed
- [#104](https://github.com/unity-sds/mdps-ds-lib/pull/104) feat: using single collection endpoint to retrieve the collection details

## [1.1.1.dev000600] - 2025-04-07
### Changed
- [#102](https://github.com/unity-sds/mdps-ds-lib/pull/102) feat: item transfomer

## [1.1.1.dev000500] - 2025-03-24
### Changed
- [#100](https://github.com/unity-sds/mdps-ds-lib/pull/100) feat: new client cli methods

## [1.1.1.dev000401] - 2025-03-04
### Fixed
- [#98](https://github.com/unity-sds/mdps-ds-lib/pull/98) fix: client updates

## [1.1.1.dev000400] - 2025-02-10
### Changed
- [#94](https://github.com/unity-sds/mdps-ds-lib/pull/94) feat: ds client library

## [1.1.1.dev000300] - 2025-01-17
### Changed
- [#92](https://github.com/unity-sds/mdps-ds-lib/pull/92) feat: allow es connection with no ssl for demo purposes only

## [1.1.1.dev000202] - 2025-01-09
### Fixed
- [#90](https://github.com/unity-sds/mdps-ds-lib/pull/90) fix: poetry error requires project.name

## [1.1.1.dev000201] - 2025-01-08
### Fixed
- [#88](https://github.com/unity-sds/mdps-ds-lib/pull/88) fix: check bbox in granules stac

## [1.1.1.dev000200] - 2024-12-16
### Changed
- [#86](https://github.com/unity-sds/mdps-ds-lib/pull/86) feat: s3 delete

## [1.1.1.dev000100] - 2024-12-09
### Changed
- [#84](https://github.com/unity-sds/mdps-ds-lib/pull/84) feat: coginto class update

## [1.1.1] - 2024-12-09

- [#81](https://github.com/unity-sds/mdps-ds-lib/pull/81) release attempt 2
Expand Down
Empty file.
Empty file.
7 changes: 7 additions & 0 deletions mdps_ds_lib/ds_client/auth_token/token_abstract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class TokenAbstract(ABC):
@abstractmethod
def get_token(self):
return ''
12 changes: 12 additions & 0 deletions mdps_ds_lib/ds_client/auth_token/token_cognito.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import os

from mdps_ds_lib.ds_client.auth_token.token_abstract import TokenAbstract
from mdps_ds_lib.lib.cognito_login.cognito_token_retriever import CognitoTokenRetriever


class TokenCognito(TokenAbstract):
def get_token(self):
token_retriever = CognitoTokenRetriever()
token = token_retriever.start()
header = {'Authorization': f'Bearer {token}'}
return token
11 changes: 11 additions & 0 deletions mdps_ds_lib/ds_client/auth_token/token_dummy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import os

from mdps_ds_lib.ds_client.auth_token.token_abstract import TokenAbstract


class TokenDummy(TokenAbstract):
def get_token(self):
env_token = os.getenv('DS_TOKEN', None)
if env_token is None:
raise ValueError(f'missing env_token DS_TOKEN')
return env_token
19 changes: 19 additions & 0 deletions mdps_ds_lib/ds_client/auth_token/token_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from mdps_ds_lib.lib.utils.factory_abstract import FactoryAbstract


class TokenFactory(FactoryAbstract):
DUMMY = 'DUMMY'
COGNITO = 'COGNITO'

def get_instance_from_env(self, **kwargs):
raise NotImplementedError('not yet')

def get_instance(self, class_type, **kwargs):
ct = class_type.upper()
if ct == self.DUMMY:
from mdps_ds_lib.ds_client.auth_token.token_dummy import TokenDummy
return TokenDummy()
if ct == self.COGNITO:
from mdps_ds_lib.ds_client.auth_token.token_cognito import TokenCognito
return TokenCognito()
raise ModuleNotFoundError(f'cannot find ES class for {ct}')
148 changes: 148 additions & 0 deletions mdps_ds_lib/ds_client/ds_client_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
import json
import logging

import requests

from mdps_ds_lib.ds_client.auth_token.token_abstract import TokenAbstract
from mdps_ds_lib.ds_client.ds_client_base import DsClient
LOGGER = logging.getLogger(__name__)


class DsClientAdmin(DsClient):


def __init__(self, token_retriever: TokenAbstract, ds_url: str, ds_stage: str):
super().__init__(token_retriever, ds_url, ds_stage)

def add_admin_group(self, crud_actions: list, group_name: str):
request_url = f'{self._uds_url}admin/auth'
LOGGER.debug(f'request_url: {request_url}')
collection_complete_name = '.*' if self.collection is None else \
f'{self.collection}.*' if self.collection_venue is None else f'{self.collection}___{self.collection_venue}'
resources = [self.urn, self.org, self.project,
self.tenant if self.tenant is not None else '*',
self.tenant_venue if self.tenant_venue is not None else '*',
collection_complete_name
]
admin_add_body = {
"actions": [k.upper() for k in crud_actions],
"resources": [':'.join(resources)],
"tenant": self.tenant,
"venue": self.tenant_venue,
"group_name": group_name
}
LOGGER.debug(f"admin_add_body: {admin_add_body}")
s = requests.session()
s.trust_env = self._trust_env
response = s.put(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env, data=json.dumps(admin_add_body))
response.raise_for_status()
return response.text

def delete_admin_group(self, group_name: str):
request_url = f'{self._uds_url}admin/auth'
LOGGER.debug(f'request_url: {request_url}')
admin_delete_body = {
"tenant": self.tenant,
"venue": self.tenant_venue,
"group_name": group_name
}
LOGGER.debug(f"admin_add_body: {admin_delete_body}")
s = requests.session()
s.trust_env = self._trust_env
response = s.delete(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env, data=json.dumps(admin_delete_body))
response.raise_for_status()
return response.text

def list_admin_group(self, group_names: list=[]):
request_url = f'{self._uds_url}admin/auth'
params = [
f'tenant={self.tenant}',
f'venue={self.tenant_venue}',
]
if len(group_names) < 1:
params.append(f'group_names={",".join(group_names)}')
params = '&'.join(params)
request_url = f'{request_url}?{params}'
LOGGER.debug(f'request_url: {request_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.get(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env)
response.raise_for_status()
return json.loads(response.text)

def update_admin_group(self, crud_actions: list, group_name: str):
raise NotImplementedError(f'TO DO')

def setup_database(self):
es_setup_url = f'{self._uds_url}admin/system/es_setup/'
print(f'es_setup_url: {es_setup_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.put(url=es_setup_url, headers={'Authorization': f'Bearer {self._token_retriever.get_token()}'}, verify=self._trust_env)
response.raise_for_status()
return response.text

def add_tenant_database_index(self, custom_metadata_es_index: dict):
request_url = f'{self._uds_url}admin/custom_metadata/{self.tenant}/'
if self.tenant_venue is not None:
request_url = f'{request_url}?venue={self.tenant_venue}'
print(f'request_url: {request_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.put(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env, data=json.dumps(custom_metadata_es_index))
response.raise_for_status()
return response.text

def get_tenant_database_index(self):
request_url = f'{self._uds_url}admin/custom_metadata/{self.tenant}/'
if self.tenant_venue is not None:
request_url = f'{request_url}?venue={self.tenant_venue}'
print(f'request_url: {request_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.get(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env)
response.raise_for_status()
return json.loads(response.text)

def delete_tenant_database_index(self):
request_url = f'{self._uds_url}admin/custom_metadata/{self.tenant}/'
if self.tenant_venue is not None:
request_url = f'{request_url}?venue={self.tenant_venue}'
print(f'request_url: {request_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.delete(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env)
response.raise_for_status()
return response.text

def destroy_tenant_database_index(self):
request_url = f'{self._uds_url}admin/custom_metadata/{self.tenant}/destroy/'
if self.tenant_venue is not None:
request_url = f'{request_url}?venue={self.tenant_venue}'
print(f'request_url: {request_url}')
s = requests.session()
s.trust_env = self._trust_env
response = s.delete(url=request_url, headers={
'Authorization': f'Bearer {self._token_retriever.get_token()}',
'Content-Type': 'application/json',
}, verify=self._trust_env)
response.raise_for_status()
return response.text
Loading