class DockerObject(): def __init__(self, log, host_ip, username, password, os_type='linux', ssh_lib='netmiko' ): self.log = log self.host_ip = host_ip self.username = username self.password = password self.os_type = os_type self.ssh_lib = ssh_lib self.hdl = None self.ps_dict = None self.ps_all_dict = None # Get Host Handle # Ssh to Host and create Handle if re.search( 'unicon', self.ssh_lib, re.I ): self.hdl = Connection( hostname='host', start=[ 'ssh {0}@{1}'.format( self.username, self.host_ip) ], os=self.os_type, password=password ) self.hdl.execute('stty cols 500') else: self.hdl = ConnectHandler( ip=self.host_ip, device_type=self.os_type, username=self.username, password=self.password ) self.hdl.execute('stty cols 500') # Converts the formatted docker ouput to Json and then converts to dictionary .. def convert_docker_out_to_dict(self, cmd_out ): dict_out = json.loads( "{ " + cmd_out.rstrip(",") + " }" ) pp.pprint(dict_out) self.log.info(dict_out) return dict_out # Returns a list of dicts for each container .. # By default the all option is off def get_ps_dict(self, all=False): """ Returns output of 'docker ps' command in Dictionary format. Set all flag True to get all containers including the ones stopped Key for the dict is "Names" and has the following fields .. 1. Command 2. CreatedAt 3. ID 4. Image 5. LocalVolumes 6. Mounts 7. Names 8. Networks 9. Ports 10. RunningFor 11. Size 12. Status """ docker_ps_dict = {} if all: docker_cmd = 'docker ps -a --no-trunc --format' else: docker_cmd = 'docker ps --no-trunc --format' format_options = '"\\"{{.Names}}\\": { \\"Names\\": \\"{{.Names}}\\", \\"Command\\": \"{{.Command}}\", \\"CreatedAt\\": \\"{{.CreatedAt}}\\", \\"ID\\": \\"{{.ID}}\\", \\"Image\\": \\"{{.Image}}\\", \\"LocalVolumes\\": \\"{{.LocalVolumes}}\\", \\"Mounts\\": \\"{{.Mounts}}\\", \\"Networks\\": \\"{{.Networks}}\\", \\"Ports\\": \\"{{.Ports}}\\", \\"RunningFor\\": \\"{{.RunningFor}}\\", \\"Size\\": \\"{{.Size}}\\", \\"Status\\": \\"{{.Status}}\\" },"' docker_cmd = docker_cmd + '=' + format_options print(docker_cmd) #self.hdl.send_command('stty cols 500') cmd_out = self.hdl.execute(docker_cmd) ps_dict = self.convert_docker_out_to_dict(cmd_out) return ps_dict def get_containers_list(self,): ps_dict = self.get_ps_dict() print(list(ps_dict.keys())) return(list(ps_dict.keys())) def get_all_containers_list(self,): ps_dict = self.get_ps_dict( all=True ) print(list(ps_dict.keys())) return(list(ps_dict.keys())) def get_containers_not_running_list(self, ): containers_not_running_list = [] ps_dict = self.get_ps_dict( all=True ) for container_name in ps_dict.keys(): if not re.search( 'Up', ps_dict[container_name]['Status'], re.I ): containers_not_running_list.append(container_name) print(containers_not_running_list) return containers_not_running_list def get_containers_not_running_dict(self, ): containers_not_running_dict = {} ps_dict = self.get_ps_dict( all=True ) for container_name in ps_dict.keys(): if not re.search( 'Up', ps_dict[container_name]['Status'], re.I ): containers_not_running_dict[container_name] = {} containers_not_running_dict[container_name] = ps_dict[container_name] print(containers_not_running_dict) return containers_not_running_dict def get_version_dict(self, all=False): docker_cmd = 'docker version --format="{{json .}}"' cmd_out = self.hdl.execute(docker_cmd) version_dict = json.loads(cmd_out) self.log.info(version_dict) return version_dict def get_logs(self, container_name): docker_cmd = 'docker logs {}'.format(container_name) cmd_out = self.hdl.execute(docker_cmd) self.log.info(cmd_out) return cmd_out def get_resource_usage_dict(self, ): """ get_stats_dict - Method to get the Container system level statistics Can be used for all the Resource leak verifications by taking snapshots .. """ docker_stats_dict = {} docker_cmd = 'docker stats --no-stream --format' format_options = '"\\"{{.Name}}\\": { \\"Name\\": \\"{{.Name}}\\", \\"BlockIO\\": \\"{{.BlockIO}}\\", \\"CPUPerc\\": \\"{{.CPUPerc}}\\", \\"Container\\": \\"{{.Container}}\\", \\"ID\\": \\"{{.ID}}\\", \\"MemPerc\\": \\"{{.MemPerc}}\\", \\"MemUsage\\": \\"{{.MemUsage}}\\", \\"NetIO\\": \\"{{.NetIO}}\\", \\"PIDs\\": \\"{{.PIDs}}\\" },"' docker_cmd = docker_cmd + '=' + format_options print(docker_cmd) cmd_out = self.hdl.execute(docker_cmd) stats_dict = self.convert_docker_out_to_dict(cmd_out) pp.pprint(stats_dict) return stats_dict def get_info_dict(self, ): """ get_info - Get system wide docker information as a dict Monitor Key items like ContainersRunning, ContainersStopped, Memory etc. """ docker_cmd = 'docker info --format="{{json .}}"' cmd_out = self.hdl.execute(docker_cmd) info_dict = json.loads(cmd_out) self.log.info(info_dict) return info_dict def get_inspect_dict(self, container_name ): """ get_inspect_dict - Gives the complete details of a container .. Check for State->Status, State->Dead, etc. """ inspect_dict = {} docker_cmd = 'docker inspect --format="{{json .}}"' + ' ' + container_name cmd_out = self.hdl.execute(docker_cmd) inspect_dict = json.loads(cmd_out) self.log.info(inspect_dict) pp.pprint(inspect_dict) return inspect_dict def get_health_dict(self, container_name): """ get_health_dict - Returns the health status dict of a container {"Status":"running","Running":true,"Paused":false,"Restarting":false,"OOMKilled":false,"Dead":false,"Pid":3060,"ExitCode":0,"Error":"","StartedAt":"2019-12-07T16:04:05.732225011Z","FinishedAt":"0001-01-01T00:00:00Z"} """ status_dict = {} docker_cmd = 'docker inspect --format="{{json .State}}" ' + container_name docker_out = self.hdl.execute(docker_cmd) health_dict = json.loads(docker_out) print(health_dict) return health_dict def get_events_dict(self, container_name ): events_dict = {} docker_cmd = 'docker events --format="{{json .}}" --until "1s"'