Commit c3c12fa0 authored by Mudassar Khan's avatar Mudassar Khan
Browse files

feat: optimize Docker build, implement POST endpoints, update MEC033...

feat: optimize Docker build, implement POST endpoints, update MEC033 registration, and align CSE branches

- Modified Dockerfile to reduce build time and final image size.
- Implemented POST request handling for:
  1) /applications/{appInstanceId}/confirm_ready
  2) /applications/{appInstanceId}/services
- Updated request bodies for MEC 033 registration endpoint.
- Both ACME IN-cse and MN-cse now use the master branch.
parent a19c070e
Loading
Loading
Loading
Loading
+7 −30
Original line number Diff line number Diff line
FROM ubuntu:22.04
FROM ubuntu:24.04

ENV MQTT_ENABLE=""
ENV MQTT_HOST=""
ENV MQTT_PORT=""
@@ -16,38 +17,17 @@ ENV MEC_SANDBOX_SERVER=""

RUN echo "meep-acme-in-cse" > /etc/hostname \
    && DEBIAN_FRONTEND=noninteractive apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y \
      autoconf \
      bison \
      build-essential \
      cmake \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      curl \
      dos2unix \
      doxygen \
      emacs \
      expect \
      flex \
      g++ \
      gcc \
      gettext \
      git \
      gnutls-bin \
      iputils-ping \
      jq \
      libedit2 \
      libedit-dev \
      libffi-dev \
      libglib2.0-dev \
      libgcrypt-dev \
      libjsoncpp-dev \
      libncurses5-dev \
      libpcap-dev \
      libssl-dev \
      libtool-bin \
      libtool \
      libxml2-dev \
      libxml2-utils \
      libyaml-dev \
      lsof \
      ntp \
      pkg-config \
@@ -55,24 +35,21 @@ RUN echo "meep-acme-in-cse" > /etc/hostname \
      python3-pip \
      python3-setuptools \
      sudo \
      sshpass \
      tcpdump \
      tzdata \
    && DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \
    && DEBIAN_FRONTEND=noninteractive apt-get autoclean \
    && DEBIAN_FRONTEND=noninteractive apt-get clean \
    && pip3 install --no-cache-dir --upgrade pip
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app

#RUN git clone --branch development https://github.com/ankraft/ACME-oneM2M-CSE.git ACME-oneM2M-CSE
RUN git clone https://github.com/ankraft/ACME-oneM2M-CSE.git ACME-oneM2M-CSE
RUN git clone --branch master https://github.com/ankraft/ACME-oneM2M-CSE.git ACME-oneM2M-CSE

WORKDIR /usr/src/app/ACME-oneM2M-CSE

COPY ./data /usr/src/app/ACME-oneM2M-CSE

RUN chmod +x entrypoint.sh \
  && pip3 install --no-cache-dir -r requirements.txt
  && pip3 install --no-cache-dir -r requirements.txt --break-system-packages

ENTRYPOINT ["./entrypoint.sh"]
 No newline at end of file
+17 −15
Original line number Diff line number Diff line
@@ -2,7 +2,9 @@
set -e

echo "MEEP_HOST_URL: ${MEEP_HOST_URL}"
SERVER_IP="${MEEP_HOST_URL#http://}"; MEEP_HOST_URL="${MEEP_HOST_URL#https://}"
# SERVER_IP="${MEEP_HOST_URL#http://}"; MEEP_HOST_URL="${MEEP_HOST_URL#https://}"
SERVER_IP="${MEEP_HOST_URL#http://}"
SERVER_IP="${SERVER_IP#https://}"

echo "MEC_PLATFORM=$MEC_PLATFORM"
echo "MEEP_SANDBOX_NAME=$MEEP_SANDBOX_NAME"
@@ -21,21 +23,21 @@ echo "MQTT_USERNAME: ${MQTT_USERNAME}"
echo "MQTT_PASSWORD: ${MQTT_PASSWORD}"

# Retrieve the internal meep-mosquitto IP address
SERVICE_NAME="meep-cloud-mosquitto"
SERVICE_NAME="monaco-telecom-meep-cloud-mosquitto"
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
MOSQUITTO_NODE_IP_ADDRESS=$(curl -sSk \
  -H "Authorization: Bearer $TOKEN" \
  https://kubernetes.default.svc/api/v1/namespaces/$NAMESPACE/services/$SERVICE_NAME \
  | jq -r '.spec.clusterIP')
echo "Internal IP exposed for service [$SERVICE_NAME] in namespace [$NAMESPACE] is: $MOSQUITTO_NODE_IP_ADDRESS"

# Retrieve the internal meep-mosquitto port id
MOSQUITTO_NODE_PORT=$(curl -sSk \
  -H "Authorization: Bearer $TOKEN" \
  https://kubernetes.default.svc/api/v1/namespaces/$NAMESPACE/services/$SERVICE_NAME \
  | jq -r '.spec.ports[0].targetPort')
echo "Internal NodePort exposed for service [$SERVICE_NAME] in namespace [$NAMESPACE] is: $MOSQUITTO_NODE_PORT"
# MOSQUITTO_NODE_IP_ADDRESS=$(curl -sSk \
#   -H "Authorization: Bearer $TOKEN" \
#   https://kubernetes.default.svc/api/v1/namespaces/$NAMESPACE/services/$SERVICE_NAME \
#   | jq -r '.spec.clusterIP')
# echo "Internal IP exposed for service [$SERVICE_NAME] in namespace [$NAMESPACE] is: $MOSQUITTO_NODE_IP_ADDRESS"

# # Retrieve the internal meep-mosquitto port id
# MOSQUITTO_NODE_PORT=$(curl -sSk \
#   -H "Authorization: Bearer $TOKEN" \
#   https://kubernetes.default.svc/api/v1/namespaces/$NAMESPACE/services/$SERVICE_NAME \
#   | jq -r '.spec.ports[0].targetPort')
# echo "Internal NodePort exposed for service [$SERVICE_NAME] in namespace [$NAMESPACE] is: $MOSQUITTO_NODE_PORT"

if [[ ! -z "${MEEP_MEP_NAME}" ]]; then
    svcPath="${MEEP_SANDBOX_NAME}/${MEEP_MEP_NAME}"
@@ -62,7 +64,7 @@ ENABLE_WS=${ENABLE_WS:-false}

# MQTT Configuration
MQTT_ENABLE=${MQTT_ENABLE:-true}
MQTT_HOST=${MOSQUITTO_NODE_IP_ADDRESS:-"meep-cloud-mosquito"}
MQTT_HOST=${MOSQUITTO_NODE_IP_ADDRESS:-"monaco-telecom-meep-cloud-mosquitto"}
MQTT_PORT=${MOSQUITTO_NODE_PORT:-443}
MQTT_USERNAME=${MQTT_USERNAME:-"acme-mn-cse"}
MQTT_PASSWORD=${MQTT_PASSWORD:-"mqtt"}
+5 −30
Original line number Diff line number Diff line
FROM ubuntu:22.04
FROM ubuntu:24.04

ENV SERVER_TYPE=""
ENV SERVER_IP=""
@@ -24,40 +24,17 @@ ENV ACME_IN_SERVICE_NAME=""

RUN echo "meep-acme-mn-cse" > /etc/hostname \
    && DEBIAN_FRONTEND=noninteractive apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y \
    && DEBIAN_FRONTEND=noninteractive apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y \
      autoconf \
      bison \
      build-essential \
      cmake \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      curl \
      dos2unix \
      doxygen \
      emacs \
      expect \
      flex \
      g++ \
      gcc \
      gettext \
      git \
      gnutls-bin \
      iputils-ping \
      jq \
      libedit2 \
      libedit-dev \
      libffi-dev \
      libglib2.0-dev \
      libgcrypt-dev \
      libjsoncpp-dev \
      libncurses5-dev \
      libpcap-dev \
      libssl-dev \
      libtool-bin \
      libtool \
      libxml2-dev \
      libxml2-utils \
      libyaml-dev \
      lsof \
      ntp \
      pkg-config \
@@ -65,24 +42,22 @@ RUN echo "meep-acme-mn-cse" > /etc/hostname \
      python3-pip \
      python3-setuptools \
      sudo \
      sshpass \
      tcpdump \
      tzdata \
    && DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \
    && DEBIAN_FRONTEND=noninteractive apt-get autoclean \
    && DEBIAN_FRONTEND=noninteractive apt-get clean \
    && pip3 install --no-cache-dir --upgrade pip
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app

RUN git clone --branch development https://github.com/ankraft/ACME-oneM2M-CSE.git ACME-oneM2M-CSE
RUN git clone --branch master https://github.com/ankraft/ACME-oneM2M-CSE.git ACME-oneM2M-CSE

WORKDIR /usr/src/app/ACME-oneM2M-CSE

COPY ./data /usr/src/app/ACME-oneM2M-CSE

RUN chmod +x entrypoint.sh \
  && pip3 install --no-cache-dir -r requirements.txt
  && pip3 install --no-cache-dir -r requirements.txt --break-system-packages

ENTRYPOINT ["./entrypoint.sh"]
+2 −0
Original line number Diff line number Diff line
@@ -79,3 +79,5 @@ mec_platform=$MEC_PLATFORM
mec_sandbox_id=$MEC_SANDBOX_ID
cse_external_ip=$CSE_EXTERNAL_IP
cse_external_port=$CSE_EXTERNAL_PORT
fullAddress=$MN_CSE_FULL_ADDRESS
mec_app_instance_id=$MEC_APP_INSTANCE_ID
 No newline at end of file
+99 −9
Original line number Diff line number Diff line
@@ -48,7 +48,9 @@ class MECClient(object):
		'mqtt_port',
		'wss_path',
		'cse_resourceID',
		'fullAddress',
		'isStopped',
		'mec_app_instance_id',
		'mecConnection',
		'mecConnections',
		'isInfo',
@@ -59,7 +61,9 @@ class MECClient(object):

	# TODO move config handling to event handler

	def __init__(self, p_http_address: str, p_http_port: str, p_cse_resourceID: str, p_cse_external_ip: str, p_cse_external_port: str, p_use_wss: bool, p_mqtt_address: str, p_mqtt_port: str, p_wss_path: str = "") -> None:
	def __init__(self, p_http_address: str, p_http_port: str, p_cse_resourceID: str, 
			  p_cse_external_ip: str, p_cse_external_port: str, p_use_wss: bool, p_mqtt_address: str, 
			  p_mqtt_port: str, p_fullAddress: str, p_mec_app_instance_id: str , p_wss_path: str = "") -> None:
		"""	Initialize the MEC client.
		"""
		self.http_address = p_http_address
@@ -73,6 +77,8 @@ class MECClient(object):
		self.mqtt_address = p_mqtt_address
		self.mqtt_port = p_mqtt_port
		self.wss_path = p_wss_path
		self.fullAddress = p_fullAddress
		self.mec_app_instance_id = p_mec_app_instance_id

		self.isStopped = False
		""" Flag to indicate whether the MEC client is stopped. """
@@ -213,7 +219,7 @@ class MECClient(object):
			userTransportInfoList = []
			userTransportInfo = {}
			userTransportInfo['id'] = str(uuid.uuid4())
			userTransportInfo['name'] = self.cse_resourceID
			userTransportInfo['name'] = Configuration.cse_resourceName
			userTransportInfo['type'] = 'MB_TOPIC_BASED'
			if self.use_wss:
				userTransportInfo['description'] = 'MQTT over WS-Secured'
@@ -223,6 +229,10 @@ class MECClient(object):
				userTransportInfo['protocol'] = 'MQTT'
			userTransportInfo['version'] = '2'
			userTransportInfo['endpoint'] = {}
			# userTransportInfo['endpoint']['addresses'] = []
			# The MEC API expects an array of URIs for the endpoint 'uris' field.
			# Previously this was set to a single string which caused the server
			# to return: "cannot unmarshal string into Go struct field ... uris of type []string".
			if self.use_wss:
				userTransportInfo['endpoint']['uris'] = []
				userTransportInfo['endpoint']['uris'].append('wss://' + self.mqtt_address + ':' + str(self.mqtt_port) + self.wss_path)
@@ -231,11 +241,16 @@ class MECClient(object):
				address['port'] = self.mqtt_port
				userTransportInfo['endpoint']['addresses'].append(address)
			else:
				userTransportInfo['endpoint']['addresses'] = []
				address = {}
				address['host'] = self.mqtt_address
				address['port'] = self.mqtt_port
				userTransportInfo['endpoint']['addresses'].append(address)
				# userTransportInfo['endpoint']['addresses'] = []
				# address = {}
				# address['host'] = self.mqtt_address
				# address['port'] = self.mqtt_port
				# userTransportInfo['endpoint']['addresses'].append(address)
				userTransportInfo['endpoint']['uris'] = [ self.fullAddress ]
			# address = {}
			# address['host'] = self.mqtt_address
			# address['port'] = self.mqtt_port
			# userTransportInfo['endpoint']['addresses'].append(address)
			userTransportInfo['security'] = {}
			userTransportInfo['implSpecificInfo'] = {}
			userTransportInfoList.append(userTransportInfo)
@@ -262,7 +277,7 @@ class MECClient(object):

			tries = 0
			while tries < 5:
				response = requests.post(url, headers=self.headers, json=body_json)
				response = requests.post(url, headers=self.headers, json=body_json, verify=False)
				L.isInfo and L.log(f'MECClient.registerToMec: response.content: ' + str(response.content))
				if response.status_code == 201:
					self.register = Result()
@@ -292,7 +307,7 @@ class MECClient(object):
					'/' + Configuration.mec_sandbox_id + \
					'/' + Configuration.mec_platform + \
					'/iots/v1/registered_iot_platforms/' + json_dict['iotPlatformId']
				response = requests.delete(url, headers=self.headers)
				response = requests.delete(url, headers=self.headers, verify=False)
				self.register = None
				return Result(rsc = response.status_code)
			except Exception as e:
@@ -300,3 +315,78 @@ class MECClient(object):
			
		self.register = None
		return Result(rsc = ResponseStatusCode.INTERNAL_SERVER_ERROR, dbg = 'MEC Deregistration failure')

	def confirm_readyToMec(self) -> Result:
		"""	Confirm readiness to MEC platform.
		"""
		if self.isStopped:
			return Result(rsc = ResponseStatusCode.INTERNAL_SERVER_ERROR, dbg = 'MEC client is not running')

		try:
			req_body = {
				"indication": "READY"
			}
			url = \
				Configuration.mec_protocol + '://' +Configuration.mec_host + ':' + str(Configuration.mec_port) + \
				'/' + Configuration.mec_sandbox_id + \
				'/' + Configuration.mec_platform + \
				'/mec_app_support/v2/applications/' + self.mec_app_instance_id + '/confirm_ready'
			L.log('MECClient.confirm_readyToMec: ' + str(req_body))
			L.log('MECClient.confirm_readyToMec: ' + str(url))
			response = requests.post(url, headers=self.headers, json=req_body, verify=False)
			return Result(rsc = response.status_code)
		except Exception as e:
			L.logErr(f'MECClient.confirm_readyToMec: ' + str(e))
			return Result(rsc = ResponseStatusCode.INTERNAL_SERVER_ERROR, dbg = 'MEC Confirm readiness failure')

	def post_mec_service(self) -> Result:
		"""
			Declare MEC service to MEC platform.
			This function declares MN-CSE as MEC service to the MEC platform.
		"""
		if self.isStopped:
			return Result(rsc = ResponseStatusCode.INTERNAL_SERVER_ERROR, dbg = 'MEC client is not running')

		try:
			req_body = {
				"serName": Configuration.cse_resourceName,
				"serCategory": {
					"href": "catalogueHref",
					"id": Configuration.cse_cseID,
					"name": Configuration.cse_resourceName,
					"version": "v1"
				},
				"version": "v1.0.0",
				"state": "ACTIVE",
				"transportInfo": {
					"id": "acme-mn-cse-transport",
					"name": "REST",
					"type": "REST_HTTP",
					"protocol": "HTTPS",
					"version": "4.0",
					"endpoint": {
						"uris": [
							self.fullAddress
						],
						"fqdn": None,
						"addresses": None,
						"alternative": None
					},
					"security": None
				},
				"serializer": "JSON",
				"scopeOfLocality": "MEC_SYSTEM",
				"consumedLocalOnly": True
			}
			url = \
				Configuration.mec_protocol + '://' + Configuration.mec_host + ':' + str(Configuration.mec_port) + \
				'/' + Configuration.mec_sandbox_id + \
				'/' + Configuration.mec_platform + \
				'/mec_service_mgmt/v1/applications/' + self.mec_app_instance_id + '/services'
			L.log('MECClient.POST_mec_service: ' + str(req_body))
			L.log('MECClient.POST_mec_service: ' + str(url))
			response = requests.post(url, headers=self.headers, json=req_body, verify=False)
			return Result(rsc = response.status_code)
		except Exception as e:
			L.logErr(f'MECClient.POST_mec_service: ' + str(e))
			return Result(rsc = ResponseStatusCode.INTERNAL_SERVER_ERROR, dbg = 'MEC Declare MEC service failure')
 No newline at end of file
Loading