Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
9bcb1db
Grafana updates including: Upgraded to v12, switched internal DB to P…
DavidEdell Nov 29, 2025
e540ba4
Added to UI a prototype Help page and a Not Found page handler.
DavidEdell Nov 29, 2025
d8c5af4
Resolve default database warning in grafana (hopefully).
DavidEdell Dec 1, 2025
ca174dd
Added upgrading file
DavidEdell Dec 1, 2025
d968c1a
Add amp-manager to UI Status page
DavidEdell Dec 2, 2025
c24e9a3
added inifinity-datasource plugin and example panels
Dec 9, 2025
ddc8798
updated layout of panels
Dec 9, 2025
04d219c
Fix core '/services' REST API to return JSON instead of text
DavidEdell Dec 9, 2025
fc9caae
Core REST API bugfixes to detect timeouts and resolve potential error…
DavidEdell Dec 9, 2025
356a034
initial dev creating a internal transcoder
Dec 17, 2025
8a49c42
working version, added new profile default is internal transcoding
Dec 18, 2025
b506a84
Merge remote-tracking branch 'origin/295-new-configuration-of-transco…
DavidEdell Dec 18, 2025
14eda5f
working transcoder fixed issue with threading and DB
Dec 18, 2025
ccde72c
Merge remote-tracking branch 'origin/295-new-configuration-of-transco…
DavidEdell Dec 18, 2025
337e912
Automatically create GHCR images when a tag is created. This suppleme…
DavidEdell Dec 19, 2025
4170e90
Fix ghcr name if triggered by tag
DavidEdell Dec 19, 2025
a055b23
Fixing grafana authnz/demo websocket proxy configuration.
DavidEdell Feb 9, 2026
2154cfc
removed services related to transcoder since they arent up by default
Feb 10, 2026
928c859
added --ignore flag for podman volume creaete to avoid name error
Feb 12, 2026
73096f8
moved grafana db password to enviroment var
Feb 19, 2026
a825c12
moving adms init
Feb 23, 2026
ee8c918
Merge remote-tracking branch 'origin/main' into 187-improve-initial-d…
Feb 24, 2026
92d6b78
Update README.md
mfarina1 Mar 3, 2026
1032a48
Updated REST APIs to return correct error codes, and updated dtnma-to…
DavidEdell Mar 3, 2026
c685598
moved init adms logic into transcoder
Mar 5, 2026
f817d70
added new folder for adding new ADMS in core
Mar 5, 2026
1cbcf10
added gitignore to extra_adms to avoid extra adms be added to main
Mar 5, 2026
15052f6
Add REFDA startup to allow ipn-scheme managers all access
BrianSipos Mar 6, 2026
67003a7
Updating all deps references.
DavidEdell Mar 6, 2026
b19e333
Force CI build to run with no-cache
DavidEdell Mar 6, 2026
e36b27e
Update README.md following Edell's feedback
mfarina1 Mar 9, 2026
1e7860e
moved init logic to avoid loop startup error
Mar 10, 2026
14cdced
Update README.md
mfarina1 Mar 10, 2026
3ee0d50
loading default ADMs controlled by a new route
Mar 10, 2026
d46a7cb
Update README.md
mfarina1 Mar 11, 2026
4a2c5a1
Merge remote-tracking branch 'origin/mfarina1-readme-updates' into 32…
DavidEdell Mar 11, 2026
cbb8cab
Removed some pip caching in case that is the cause for the old file l…
DavidEdell Mar 11, 2026
6913071
Revert "Force CI build to run with no-cache"
DavidEdell Mar 13, 2026
5b96e5d
Merge remote-tracking branch 'origin/main' into 305-rest-api-error-ha…
DavidEdell Mar 13, 2026
3e3291e
Address SonarQube documentation warning.
DavidEdell Mar 17, 2026
fc68cd2
Use HTTP status code enums consistently.
DavidEdell Mar 17, 2026
39852a7
setting cache to store processed reports
Mar 17, 2026
2679935
Fixed an additional error return.
DavidEdell Mar 17, 2026
888e82f
Merge branch 'main' into 281-user-friendly-decommutation-of-received-…
Mar 18, 2026
0e7282c
Merge remote-tracking branch 'origin/main' into 324-testing-ci
DavidEdell Mar 24, 2026
ae54c14
Merge remote-tracking branch 'origin/305-rest-api-error-handling' int…
DavidEdell Mar 24, 2026
04b84ee
Revert "Removed some pip caching in case that is the cause for the ol…
DavidEdell Mar 24, 2026
c4a4056
Test workflow cleanup
DavidEdell Mar 24, 2026
d152f95
Restoring podman service start [with fix for workflow warning]
DavidEdell Mar 24, 2026
7dadec4
Attempt to force docker format to enable healthcheck in podman
DavidEdell Mar 25, 2026
fc50315
ChatGPT suggested alternative status check
DavidEdell Mar 25, 2026
89198d2
Adding logs output for failed containers
DavidEdell Mar 26, 2026
607d265
Experiment: Does diabling anms-ui healthcheck make a difference?
DavidEdell Mar 30, 2026
6c42449
Experiment: Does removing dependency checks make a difference?
DavidEdell Mar 30, 2026
c26d469
updated to to use newest SQL for reports
Apr 3, 2026
3fc2e5c
added COPY for startup.uri
Apr 3, 2026
9a30211
added for querying for report templates
Apr 3, 2026
7d82f6a
Merge remote-tracking branch 'origin/305-rest-api-error-handling' int…
Apr 3, 2026
525fbcf
updated grafana to use new rptsets
Apr 6, 2026
2db0a8a
updated to include rpt_item_index
Apr 6, 2026
4a7c09a
updated to uses time_offset as a timestamp
Apr 7, 2026
1b4f28b
updated test execset
Apr 7, 2026
a4140b5
removed special char
Apr 7, 2026
8580547
adding logs
Apr 7, 2026
a4ab73b
latest dtnma-tools
Apr 7, 2026
5ee8bb2
Merge remote-tracking branch 'origin/281-user-friendly-decommutation-…
DavidEdell Apr 9, 2026
2b142f9
Merge branch 'main' into 324-testing-ci
DavidEdell Apr 21, 2026
4f97c2a
Sync submodule ref with main.
DavidEdell Apr 21, 2026
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
64 changes: 63 additions & 1 deletion .github/workflows/build-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,73 @@ jobs:
run: |
# testenv started before
${DOCKER_CMD} compose ${TESTENV_COMPOSE_OPTS} up -d --force-recreate
${DOCKER_CMD} compose ${ANMS_COMPOSE_OPTS} up -d --force-recreate --wait --wait-timeout 600
${DOCKER_CMD} compose ${ANMS_COMPOSE_OPTS} up -d --force-recreate
- name: Wait for containers to become healthy
run: |
set -e

TIMEOUT=600
INTERVAL=5
ELAPSED=0

echo "Waiting for containers to become healthy (timeout: ${TIMEOUT}s)..."

while true; do
# Get all running container IDs
CONTAINERS=$(${DOCKER_CMD} ps -q)

if [ -z "$CONTAINERS" ]; then
echo "No running containers found yet..."
sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))
continue
fi

# Check health status (ignore containers without healthchecks)
UNHEALTHY=$(${DOCKER_CMD} inspect \
--format '{{if .State.Health}}{{.Name}} {{.State.Health.Status}}{{end}}' \
$CONTAINERS | grep -v ' healthy' || true)

if [ -z "$UNHEALTHY" ]; then
echo "All containers are healthy ✅"
break
fi

echo "Still waiting on:"
echo "$UNHEALTHY"
echo "---"

sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))

if [ "$ELAPSED" -ge "$TIMEOUT" ]; then
echo "ERROR: Timed out waiting for healthy containers"
${DOCKER_CMD} ps

echo ""

echo "=== Failing container logs ==="

# Loop through failing containers and dump logs
echo "$UNHEALTHY" | while read -r line; do
NAME=$(echo "$line" | awk '{print $1}' | sed 's#^/##')

echo ""
echo "----- Logs for $NAME -----"

# Try compose logs first (nicer formatting)
${DOCKER_CMD} compose ${ANMS_COMPOSE_OPTS} logs --no-color "$NAME" || \
${DOCKER_CMD} logs "$NAME" || \
echo "Unable to retrieve logs for $NAME"
done
exit 1
fi
done
- name: Status
if: always()
run: |
${DOCKER_CMD} compose ${ANMS_COMPOSE_OPTS} ps
${DOCKER_CMD} compose ${TESTENV_COMPOSE_OPTS} ps
for BADSTATUS in stopped restarting; do
${DOCKER_CMD} compose ${ANMS_COMPOSE_OPTS} ps --services --filter status=${BADSTATUS} | tee -a /tmp/notgood
done
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ If yes, do not rely on this README for operational guidance. Refer to the ANMS P
**3. Are you a developer contributing to ANMS or setting up a development environment?**

If yes, refer to both this README and the ANMS Wiki [Development Guide](https://github.com/NASA-AMMOS/anms/wiki/Development-Guide) for:

* Local development environment configuration
* Testing workflows
* Contribution guidelines
Expand Down
1 change: 1 addition & 0 deletions anms-core/anms/components/schemas/ARIs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,5 @@
from .registered_agent import RegisteredAgentInDBBase
from .rpt_entry import RptEntry
from .rpt_entry import RptEntryName
from .rpt_entry import RptEntryFull
from .rpt_entry import RptEntryBaseInDBBase
24 changes: 19 additions & 5 deletions anms-core/anms/components/schemas/ARIs/rpt_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,26 @@ class RptEntryBase(BaseModel):
class Config:
arbitrary_types_allowed = True

ari_rptset_id: Optional[str] = None
reference_time: Optional[datetime] = None
report_list: Optional[str] = None
agent_id: Optional[int] = None

ari_rptset_id: Optional[int] = None
reference_time: Optional[datetime] = None
mgr_time: Optional[datetime] = None
nonce_cbor: Optional[str] = None
time_offset: Optional[datetime] = None
report_source: Optional[str] = None
report_items: Optional[list] = None
report_item_indexes: Optional[list] = None

# Shared properties
class RptEntryFull(RptEntryBase):
class Config:
arbitrary_types_allowed = True
orm_mode = True

agent_id: Optional[int] = None
ari_rptlist_id: Optional[int] = None



class RptEntryBaseInDBBase(RptEntryBase):
class Config:
orm_mode = True
Expand Down
58 changes: 58 additions & 0 deletions anms-core/anms/models/relational/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (c) 2023 The Johns Hopkins University Applied Physics
# Laboratory LLC.
#
# This file is part of the Asynchronous Network Management System (ANMS).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This work was performed for the Jet Propulsion Laboratory, California
# Institute of Technology, sponsored by the United States Government under
# the prime contract 80NM0018D0004 between the Caltech and NASA under
# subcontract 1658085.
#
from typing import Any
from typing import Dict

from anms.models.relational import Model
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String

# class for vw_ctrl_definition used for build ari
class Const(Model):
__tablename__ = 'vw_const_actual'
obj_actual_definition_id = Column(Integer, primary_key=True)
data_type = Column(String)
data_value = Column(String)
use_desc = Column(String)
obj_metadata_id = Column(Integer)
data_model_name = Column(String)
namespace = Column(String)
data_type_id = Column(Integer)
name = Column(String)
data_model_id = Column(Integer)
object_enumeration = Column(Integer)
status = Column(String)
reference = Column(String)
description = Column(String)

def __repr__(self) -> str:
return self.as_dict().__repr__()

def as_dict(self) -> Dict[str, Any]:
dict_obj = {
c.name: getattr(self, c.name) for c in self.__table__.columns
}

return dict_obj
3 changes: 2 additions & 1 deletion anms-core/anms/models/relational/execution_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import LargeBinary
from anms.shared.transmogrifier import TRANSMORGIFIER


# class for vw_ctrl_definition used for build ari
Expand All @@ -47,7 +48,7 @@ def __repr__(self) -> str:
def as_dict(self) -> Dict[str, Any]:
dict_obj = {
'execution_set_id': getattr(self, 'execution_set_id'),
'nonce_cbor': getattr(self, 'nonce_cbor'),
'nonce_cbor': TRANSMORGIFIER._ace_transcode_just_cbor("0x"+getattr(self, 'nonce_cbor').hex()),
'use_desc': getattr(self, 'use_desc'),
'agent_id': getattr(self, 'agent_id'),
'num_entries': getattr(self, 'num_entries'),
Expand Down
44 changes: 30 additions & 14 deletions anms-core/anms/models/relational/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,49 @@
from typing import Any
from typing import Dict

from anms.shared.transmogrifier import TRANSMORGIFIER
from anms.models.relational import Model
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import DateTime
from sqlalchemy import ARRAY
from sqlalchemy import LargeBinary

from sqlalchemy import orm

# class for vw_ctrl_definition used for build ari
class Report(Model):
__tablename__ = 'ari_rptset'
ari_rptset_id = Column(Integer, primary_key=True)
nonce_cbor = Column(LargeBinary)
reference_time = Column(Integer)
report_list = Column(String)
report_list_cbor = Column(LargeBinary)
agent_id = Column(Integer)
__tablename__ = 'vw_ari_rpt_set'
ari_rptset_id = Column(Integer, primary_key=True)
mgr_time = Column(DateTime)
reference_time = Column(DateTime)
nonce_cbor = Column(LargeBinary)
agent_id = Column(Integer)
ari_rptset_cbor = Column(LargeBinary)
ari_rptlist_id = Column(Integer)
time_offset = Column(DateTime)
report_source = Column(LargeBinary)
report_items = Column(ARRAY(LargeBinary) )#bytea[] NULL
report_item_indexes = Column(ARRAY(Integer))
# processing the raw cbor into an ari object
@orm.reconstructor
def init_on_load(self):
self.nonce_cbor = TRANSMORGIFIER.transcode("0x"+getattr(self, 'nonce_cbor').hex())['uri']
self.report_source = TRANSMORGIFIER.transcode("0x"+getattr(self, 'report_source').hex())['uri']
self.report_items = [TRANSMORGIFIER.transcode("0x"+x.hex())['uri'] for x in getattr(self, 'report_items')]

def __repr__(self) -> str:
return self.as_dict().__repr__()

def as_dict(self) -> Dict[str, Any]:
dict_obj = {
'ari_rptset_id': getattr(self, 'ari_rptset_id'),
'nonce_cbor': getattr(self, 'nonce_cbor'),
'reference_time': getattr(self, 'reference_time'),
'report_list': getattr(self, 'report_list'),
'report_list_cbor': getattr(self, 'report_list_cbor'),
'agent_id': getattr(self, 'agent_id')
'nonce_cbor': getattr(self, 'nonce_cbor'),
'agent_id': getattr(self, 'agent_id'),
'ari_rptlist_id': getattr(self, 'ari_rptlist_id'),
'time_offset': getattr(self, 'time_offset'),
'report_source': getattr(self, 'report_source'),
'report_items': getattr(self, 'report_items'),
'report_item_indexes': getattr(self, 'report_item_indexes')
}

return dict_obj
Loading
Loading