Skip to content

Commit b0c1642

Browse files
authored
Merge pull request #428 from fabric-testbed/mcp
Bump cryptography version and improvements to query_resources
2 parents 4c6951e + ad9b18a commit b0c1642

21 files changed

Lines changed: 1029 additions & 29 deletions

docker-compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ services:
5959
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-fabric}
6060
- PGDATA=${PGDATA:-/var/lib/postgresql/data}
6161
neo4j1: &neo4j-base
62-
image: kthare10/neo4j-apoc:5.26.19
62+
image: fabrictestbed/neo4j-apoc:5.26.19
6363
restart: always
6464
container_name: neo4j1
6565
volumes:

fabric_cf/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__version__ = "1.9.1"
1+
__version__ = "1.9.2"
22
__VERSION__ = __version__

fabric_cf/actor/core/apis/abc_mgmt_client_actor.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,22 @@ def get_broker_query_model(self, *, broker: ID, id_token: str, level: int, graph
135135
"""
136136
raise ManageException(Constants.NOT_IMPLEMENTED)
137137

138+
def get_broker_query_model_summary(self, *, broker: ID, id_token: str, level: int,
139+
start: datetime = None, end: datetime = None,
140+
includes: str = None, excludes: str = None) -> BrokerQueryModelAvro:
141+
"""
142+
Obtains a JSON resource summary from the specified broker.
143+
@param broker broker
144+
@param id_token identity token generated by Credmgr
145+
@param level: level of details
146+
@param start: start time
147+
@param end: end time
148+
@param includes: comma separated lists of sites to include
149+
@param excludes: comma separated lists of sites to exclude
150+
@return BQM (model field contains JSON string)
151+
"""
152+
raise ManageException(Constants.NOT_IMPLEMENTED)
153+
138154
def build_broker_query_model(self, level_0_broker_query_model: str, level: int,
139155
graph_format: GraphFormat = GraphFormat.GRAPHML,
140156
start: datetime = None, end: datetime = None,

fabric_cf/actor/core/common/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ class Constants:
213213
ELASTIC_SIZE = "request.elasticSize"
214214

215215
QUERY_ACTION_DISCOVER_BQM = "discover.bqm"
216+
QUERY_ACTION_DISCOVER_BQM_SUMMARY = "discover.bqm.summary"
216217
QUERY_ACTION = "query.action"
217218
QUERY_RESPONSE = "query.response"
218219
QUERY_RESPONSE_STATUS = "query.response.status"

fabric_cf/actor/core/core/broker_policy.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,30 @@ def get_broker_query_model_query(*, level: int, bqm_format: GraphFormat = GraphF
155155
properties[Constants.EXCLUDES] = excludes
156156
return properties
157157

158+
@staticmethod
159+
def get_broker_query_model_summary_query(*, level: int, start: datetime = None, end: datetime = None,
160+
includes: str = None, excludes: str = None) -> dict:
161+
"""
162+
Return dictionary representing a BQM summary query (JSON dict instead of graph).
163+
:param level: Query level
164+
:param start: start time
165+
:param end: end time
166+
:param includes: comma separated lists of sites to include
167+
:param excludes: comma separated lists of sites to exclude
168+
:return dictionary representing the query
169+
"""
170+
properties = {Constants.QUERY_ACTION: Constants.QUERY_ACTION_DISCOVER_BQM_SUMMARY,
171+
Constants.QUERY_DETAIL_LEVEL: str(level)}
172+
if start:
173+
properties[Constants.START] = start.strftime(Constants.LEASE_TIME_FORMAT)
174+
if end:
175+
properties[Constants.END] = end.strftime(Constants.LEASE_TIME_FORMAT)
176+
if includes:
177+
properties[Constants.INCLUDES] = includes
178+
if excludes:
179+
properties[Constants.EXCLUDES] = excludes
180+
return properties
181+
158182
@staticmethod
159183
def get_query_action(properties: dict) -> str:
160184
"""

fabric_cf/actor/core/manage/client_actor_management_object_helper.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,37 @@ def get_broker_query_model(self, *, broker: ID, caller: AuthToken, id_token: str
182182

183183
return result
184184

185+
def get_broker_query_model_summary(self, *, broker: ID, caller: AuthToken, id_token: str,
186+
level: int, start: datetime = None,
187+
end: datetime = None, includes: str = None,
188+
excludes: str = None) -> ResultBrokerQueryModelAvro:
189+
result = ResultBrokerQueryModelAvro()
190+
result.status = ResultAvro()
191+
192+
if broker is None or caller is None:
193+
result.status.set_code(ErrorCodes.ErrorInvalidArguments.value)
194+
result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret())
195+
return result
196+
197+
try:
198+
b = self.client.get_broker(guid=broker)
199+
if b is not None:
200+
request = BrokerPolicy.get_broker_query_model_summary_query(
201+
level=level, start=start, end=end, includes=includes, excludes=excludes
202+
)
203+
response = ManagementUtils.query(actor=self.client, actor_proxy=b, query=request)
204+
result.model = Translate.translate_to_broker_query_model(query_response=response, level=level)
205+
else:
206+
result.status.set_code(ErrorCodes.ErrorNoSuchBroker.value)
207+
result.status.set_message(ErrorCodes.ErrorNoSuchBroker.interpret())
208+
except Exception as e:
209+
self.logger.error("get_broker_query_model_summary {}".format(e))
210+
result.status.set_code(ErrorCodes.ErrorInternalError.value)
211+
result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e))
212+
result.status = ManagementObject.set_exception_details(result=result.status, e=e)
213+
214+
return result
215+
185216
def add_reservation_private(self, *, reservation: TicketReservationAvro):
186217
result = ResultAvro()
187218
slice_id = ID(uid=reservation.get_slice_id())

fabric_cf/actor/core/manage/controller_management_object.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ def get_broker_query_model(self, *, broker: ID, caller: AuthToken, id_token: str
109109
graph_format=graph_format, start=start, end=end,
110110
includes=includes, excludes=excludes)
111111

112+
def get_broker_query_model_summary(self, *, broker: ID, caller: AuthToken, id_token: str,
113+
level: int, start: datetime = None,
114+
end: datetime = None, includes: str = None,
115+
excludes: str = None) -> ResultBrokerQueryModelAvro:
116+
return self.client_helper.get_broker_query_model_summary(
117+
broker=broker, caller=caller, id_token=id_token, level=level,
118+
start=start, end=end, includes=includes, excludes=excludes
119+
)
120+
112121
def add_reservation(self, *, reservation: TicketReservationAvro, caller: AuthToken) -> ResultStringAvro:
113122
return self.client_helper.add_reservation(reservation=reservation, caller=caller)
114123

fabric_cf/actor/core/manage/local/local_controller.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,33 @@ def get_brokers(self, *, broker: ID = None, id_token: str = None) -> List[ProxyA
9393
except Exception as e:
9494
self.on_exception(e=e, traceback_str=traceback.format_exc())
9595

96+
def get_broker_query_model_summary(self, *, broker: ID, id_token: str, level: int,
97+
start: datetime = None, end: datetime = None,
98+
includes: str = None, excludes: str = None) -> BrokerQueryModelAvro:
99+
"""
100+
Obtains a JSON resource summary from the specified broker.
101+
@param broker broker
102+
@param id_token identity token generated by Credmgr
103+
@param level: level of details
104+
@param start: start time
105+
@param end: end time
106+
@param includes: comma separated lists of sites to include
107+
@param excludes: comma separated lists of sites to exclude
108+
@return BQM (model field contains JSON string)
109+
"""
110+
self.clear_last()
111+
try:
112+
result = self.manager.get_broker_query_model_summary(broker=broker, caller=self.auth, id_token=id_token,
113+
level=level, start=start, end=end, excludes=excludes,
114+
includes=includes)
115+
self.last_status = result.status
116+
117+
if result.status.get_code() == 0:
118+
return result.model
119+
except Exception as e:
120+
print(e)
121+
self.on_exception(e=e, traceback_str=traceback.format_exc())
122+
96123
def get_broker_query_model(self, *, broker: ID, id_token: str, level: int, graph_format: GraphFormat,
97124
start: datetime = None, end: datetime = None,
98125
includes: str = None, excludes: str = None) -> BrokerQueryModelAvro:

fabric_cf/actor/core/policy/broker_simpler_units_policy.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
# Author: Komal Thareja (kthare10@renci.org)
2626
from __future__ import annotations
2727

28+
import json
2829
import random
2930
import threading
3031
import traceback
@@ -2234,16 +2235,11 @@ def query(self, *, p: dict) -> dict:
22342235
raise BrokerException(error_code=ExceptionErrorCode.INVALID_ARGUMENT,
22352236
msg=f"query_action {query_action}")
22362237

2237-
if query_action != Constants.QUERY_ACTION_DISCOVER_BQM:
2238+
if query_action not in (Constants.QUERY_ACTION_DISCOVER_BQM,
2239+
Constants.QUERY_ACTION_DISCOVER_BQM_SUMMARY):
22382240
raise BrokerException(error_code=ExceptionErrorCode.INVALID_ARGUMENT,
22392241
msg=f"query_action {query_action}")
22402242

2241-
bqm_format = p.get(Constants.BROKER_QUERY_MODEL_FORMAT, None)
2242-
if bqm_format is not None:
2243-
bqm_format = GraphFormat(int(bqm_format))
2244-
else:
2245-
bqm_format = GraphFormat.GRAPHML
2246-
22472243
start = p.get(Constants.START, None)
22482244
if start:
22492245
start = datetime.strptime(start, Constants.LEASE_TIME_FORMAT)
@@ -2254,6 +2250,35 @@ def query(self, *, p: dict) -> dict:
22542250
excludes = p.get(Constants.EXCLUDES, None)
22552251
includes = p.get(Constants.INCLUDES, None)
22562252

2253+
# Handle JSON summary path — bypasses graph construction entirely
2254+
if query_action == Constants.QUERY_ACTION_DISCOVER_BQM_SUMMARY:
2255+
try:
2256+
if self.query_cbm is not None:
2257+
plugin = AggregatedBQMPlugin(actor=self.actor, logger=self.logger)
2258+
summary = plugin.plug_produce_bqm_summary(
2259+
cbm=self.query_cbm, query_level=query_level,
2260+
start=start, end=end, includes=includes, excludes=excludes
2261+
)
2262+
result[Constants.BROKER_QUERY_MODEL] = json.dumps(summary)
2263+
result[Constants.QUERY_RESPONSE_STATUS] = "True"
2264+
else:
2265+
result[Constants.BROKER_QUERY_MODEL] = ""
2266+
result[Constants.QUERY_RESPONSE_STATUS] = "False"
2267+
result[Constants.QUERY_RESPONSE_MESSAGE] = "Resource(s) not found"
2268+
except Exception as e:
2269+
self.logger.error(traceback.format_exc())
2270+
self.logger.error(e)
2271+
result[Constants.BROKER_QUERY_MODEL] = ""
2272+
result[Constants.QUERY_RESPONSE_STATUS] = "False"
2273+
result[Constants.QUERY_RESPONSE_MESSAGE] = str(e)
2274+
return result
2275+
2276+
bqm_format = p.get(Constants.BROKER_QUERY_MODEL_FORMAT, None)
2277+
if bqm_format is not None:
2278+
bqm_format = GraphFormat(int(bqm_format))
2279+
else:
2280+
bqm_format = GraphFormat.GRAPHML
2281+
22572282
try:
22582283
if self.query_cbm is not None:
22592284
graph = self.query_cbm.get_bqm(query_level=query_level, start=start, end=end, includes=includes,

0 commit comments

Comments
 (0)