events=self.events.get_for_service(spec.service_name()),
created=self.spec_store.spec_created[nm],
deleted=self.spec_store.spec_deleted.get(nm, None),
+ virtual_ip=spec.get_virtual_ip(),
+ ports=spec.get_port_start(),
)
if service_type == 'nfs':
spec = cast(NFSServiceSpec, spec)
'service_id': 'r.z',
'service_name': 'rgw.r.z',
'service_type': 'rgw',
- 'status': {'created': mock.ANY, 'running': 1, 'size': 1},
+ 'status': {'created': mock.ANY, 'running': 1, 'size': 1,
+ 'ports': [80]},
}
]
for o in out:
deleted: Optional[datetime.datetime] = None,
size: int = 0,
running: int = 0,
- events: Optional[List['OrchestratorEvent']] = None) -> None:
+ events: Optional[List['OrchestratorEvent']] = None,
+ virtual_ip: Optional[str] = None,
+ ports: List[int] = []) -> None:
# Not everyone runs in containers, but enough people do to
# justify having the container_image_id (image hash) and container_image
# (image name)
self.events: List[OrchestratorEvent] = events or []
+ self.virtual_ip = virtual_ip
+ self.ports = ports
+
def service_type(self) -> str:
return self.spec.service_type
def __repr__(self) -> str:
return f"<ServiceDescription of {self.spec.one_line_str()}>"
+ def get_port_summary(self) -> str:
+ if not self.ports:
+ return ''
+ return f"{self.virtual_ip or '?'}:{','.join(map(str, self.ports or []))}"
+
def to_json(self) -> OrderedDict:
out = self.spec.to_json()
status = {
'running': self.running,
'last_refresh': self.last_refresh,
'created': self.created,
+ 'virtual_ip': self.virtual_ip,
+ 'ports': self.ports if self.ports else None,
}
for k in ['last_refresh', 'created']:
if getattr(self, k):
else:
now = datetime_now()
table = PrettyTable(
- ['NAME', 'RUNNING', 'REFRESHED', 'AGE',
- 'PLACEMENT',
- ],
+ [
+ 'NAME', 'PORTS',
+ 'RUNNING', 'REFRESHED', 'AGE',
+ 'PLACEMENT',
+ ],
border=False)
table.align['NAME'] = 'l'
+ table.align['PORTS'] = 'l'
table.align['RUNNING'] = 'r'
table.align['REFRESHED'] = 'l'
table.align['AGE'] = 'l'
table.add_row((
s.spec.service_name(),
+ s.get_port_summary(),
'%d/%d' % (s.running, s.size),
refreshed,
nice_delta(now, s.created),
# point.
return []
+ def get_virtual_ip(self) -> Optional[str]:
+ return None
+
def to_json(self):
# type: () -> OrderedDict[str, Any]
ret: OrderedDict[str, Any] = OrderedDict()
return [cast(int, self.frontend_port),
cast(int, self.monitor_port)]
+ def get_virtual_ip(self) -> Optional[str]:
+ return self.virtual_ip
+
def validate(self) -> None:
super(IngressSpec, self).validate()