def _search_all_repository(self, url, version=1, q=""): """ 搜索私有仓所有镜像 """ if url: ReqUrl = url.strip( "/") + "/v1/search" if version == 1 else url.strip( "/") + "/v2/_catalog" logger.info("_search_all_repository for url {}".format(ReqUrl)) try: Images = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify, params={ "q": q }).json() except Exception, e: logger.error(e, exc_info=True) else: if version == 1: return Images["results"] else: return [{ "name": _, "description": None } for _ in Images["repositories"] if q in _]
def _get_imageId(self, ImageName, tag="latest"): """ 查询某个镜像tag的imageId/digest """ ReqUrl = self._baseUrl + "/repositories/{}/tags/{}".format( ImageName, tag ) if self.version == 1 else self._baseUrl + "/{}/manifests/{}".format( ImageName, tag) logger.info("_get_imageId for url {}".format(ReqUrl)) try: if self.version == 1: r = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify) else: r = requests.head( ReqUrl, timeout=self.timeout, verify=self.verify, allow_redirects=True, headers={ "Content-Type": "application/vnd.docker.distribution.manifest.v2+json" }) except Exception, e: logger.error(e, exc_info=True) return False
def DELETE(self, serviceFlag): #delete a service res = {"msg": None, "code": 0} logger.info(serviceFlag) if not self.leader: res.update(msg="No active swarm", code=-1000) logger.info(res) return res if not serviceFlag: res.update(msg="no service id or name<%s>" % serviceFlag, code=50100) logger.info(res) return res logger.info("delete service, check parameters pass") try: SwarmEngineServiceDeleteUrl = Splice(netloc=self.leader, port=self.port, path="/services/%s" % serviceFlag).geturl SwarmEngineServiceDeleteRes = requests.delete( SwarmEngineServiceDeleteUrl, timeout=self.timeout, verify=self.verify) SwarmEngineServiceDeleteCode = SwarmEngineServiceDeleteRes.status_code except Exception, e: logger.error(e, exc_info=True) res.update(success=False, code=50200, msg="delete service<%s> fail" % serviceFlag)
def _pickleActive(self, data): """ 序列化活跃仓库数据写入存储 """ try: with open(self._dir1, "w") as f: json.dump(data, f) except Exception, e: logger.error(e, exc_info=True) res = False
def status(self): """ 返回私有仓状态 """ ReqUrl = self._baseUrl + "/_ping" if self.version == 1 else self._baseUrl try: r = requests.head(ReqUrl, timeout=self.timeout, verify=self.verify) except Exception, e: logger.error(e, exc_info=True)
def POST(self, name, addr, version=1, auth=None): """ 创建 """ res = {"msg": None, "code": 0} try: version = int(version) except Exception, e: logger.error(e, exc_info=True) res.update(msg="params error", code=-10002) logger.info(res) return res
def _checkSwarmNodeinfo(self, ip): """ 查询节点信息 """ try: NodeUrl = Splice(netloc=ip, port=self.port, path="/info").geturl NodeInfo = requests.get(NodeUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) return {}
def _list_imageId_ancestry(self, ImageId): """ 列出某个镜像所有父镜像 """ ReqUrl = self._baseUrl + "/images/{}/ancestry".format(ImageId) logger.info("_list_imageId_ancestry for url {}".format(ReqUrl)) try: ImageIds = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) return False
def _delete_repository(self, ImageName): """ 删除一个镜像 """ ReqUrl = self._baseUrl + "/repositories/{}/".format(ImageName) logger.info("_delete_repository for url {}".format(ReqUrl)) try: delete_repo_result = requests.delete(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) return False
def _list_repository_tag(self, ImageName): """ 列出某个镜像所有标签 """ ReqUrl = self._baseUrl + "/repositories/{}/tags".format( ImageName ) if self.version == 1 else self._baseUrl + "/{}/tags/list".format( ImageName) logger.info("_list_repository_tag for url {}".format(ReqUrl)) try: Tags = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) return {}
def _search_all_repository(self, q): """ 搜索私有仓所有镜像 """ ReqUrl = self._baseUrl + "/search" if self.version == 1 else self._baseUrl + "/_catalog" logger.info("_search_all_repository for url {}".format(ReqUrl)) try: Images = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify, params={ "q": q }).json() except Exception, e: logger.error(e, exc_info=True) return []
def _delete_image(self, ImageName, url, version=1): """ 删除一个镜像 """ if url: ReqUrl = url.strip("/") + "/v1/repositories/{}/".format( ImageName) if version == 1 else url.strip( "/") + "/v2/{}/xxx".format(ImageName) logger.info("_delete_repository for url {}".format(ReqUrl)) try: delete_repo_result = requests.delete( ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) else: return delete_repo_result
def _checkStatus(self, url, version=1): """ 返回私有仓状态 """ if url: url = url.strip("/") + "/v1/_ping" if version == 1 else url.strip( "/") + "/v2/" try: req = requests.head(url, timeout=self.timeout, verify=self.verify) except Exception, e: logger.error(e, exc_info=True) else: logger.info(req.status_code) return req.ok
def _get_imageId_info(self, ImageId, url, version=1): """ 查询某个镜像的信息 """ if url: ReqUrl = url.strip("/") + "/v1/images/{}/json".format( ImageId) if version == 1 else url.strip( "/") + "/v2/{}/tags/xxx".format(ImageName) logger.info("_get_imageId_info for url {}".format(ReqUrl)) try: ImageInfo = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) else: return ImageInfo
def _image_tag(self, ImageName, tag, url, version=1): """ 查询某个镜像tag的imageId, 删除tag """ if url: ReqUrl = url.strip("/") + "/v1/repositories/{}/tags/{}".format( ImageName, tag) if version == 1 else url.strip( "/") + "/v2/{}/tags/list".format(ImageName) logger.info("_get_imageId for url {}".format(ReqUrl)) try: ImageId = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() #result = requests.delete(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) else: return ImageId
def ApiComments(): res = {"code": 0, "data": [], "msg": None} args = dict(short_name=g.plugins['DuoshuoComment']['shortName'], range="all", num_items=request.args.get("limit", 10)) try: data = requests.get("http://api.duoshuo.com/sites/listTopThreads.json", params=args, timeout=5, headers={ "User-Agent": "Interest.blog/www.saintic.com" }).json() blog = [ _ for _ in data.get("response") if _.get("comments") != 0 and _.update( created_at=timeChange(_['created_at'])) == None ] except Exception, e: logger.error(e, exc_info=True)
def _list_image_tags(self, ImageName, url, version=1): """ 列出某个镜像所有标签 """ if url: ReqUrl = url.strip("/") + "/v1/repositories/{}/tags".format( ImageName) if version == 1 else url.strip( "/") + "/v2/{}/tags/list".format(ImageName) logger.info("_list_image_tag for url {}".format(ReqUrl)) try: Tags = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) else: if version == 1: return Tags else: return {_: "digest" for _ in Tags.get('tags', [])}
def _get_imageId_info(self, ImageId, ImageName=None): """ 查询某个镜像的信息 v1: ImageId v2: ImageName + Tag(ImageId) """ ReqUrl = self._baseUrl + "/images/{}/json".format( ImageId ) if self.version == 1 else self._baseUrl + "/{}/manifests/{}".format( ImageName, ImageId) logger.info("_get_imageId_info for url {}".format(ReqUrl)) try: ImageInfo = requests.get(ReqUrl, timeout=self.timeout, verify=self.verify).json() except Exception, e: logger.error(e, exc_info=True) return False
def UploadImage(): f = request.files.get("WriteBlogImage") if f and allowed_file(f.filename): filename = secure_filename(f.filename) #随机命名 logger.info("get allowed file %s, its name is %s" % (f, filename)) filedir = os.path.join(upload_page.root_path, UPLOAD_FOLDER) if not os.path.exists(filedir): os.makedirs(filedir) f.save(os.path.join(filedir, filename)) imgUrl = request.url_root + IMAGE_UPLOAD_DIR + filename logger.info("file saved in %s, its url is %s" % (filedir, imgUrl)) res = Response(imgUrl) res.headers["ContentType"] = "text/html" res.headers["Charset"] = "utf-8" return res else: result = r"error|未成功获取文件,上传失败" logger.error(result) res = Response(result) res.headers["ContentType"] = "text/html" res.headers["Charset"] = "utf-8" return res
def GET(self, node=None): """ 查询所有可用的节点群,并组织返回节点信息 """ res = {"code": 0, "msg": None, "data": []} if self.leader: #format (host, id, role, status, availability, reachability, containers, cpu, mem, label, UpdatedAt, DockerVersion). req_data = self._checkSwarmNode(self.leader, node) req_data = req_data if isinstance(req_data, (list, tuple)) else (req_data,) node_data = [] for i in req_data: try: node_id = i['ID'] node_role = 'Leader' if i.get('ManagerStatus', {}).get('Leader') else i['Spec'].get('Role') node_host = i.get('ManagerStatus', {}).get('Addr', '').split(':')[0] or i['Spec'].get('Labels', {}).get('ipaddr', i['Description']['Hostname']) node_status = i['Status']['State'] node_availability = i['Spec'].get('Availability') node_reachability = i.get('ManagerStatus', {}).get('Reachability') node_containers = self._checkSwarmNodeinfo(node_host).get("ContainersRunning") if ip_check(node_host) and node_status == "ready" and node_availability == "active" else 'Unknown' node_cpu = int(i['Description']['Resources']['NanoCPUs'] / 1e9) node_mem = int(i['Description']['Resources']['MemoryBytes'] / 1e6 / 1024) #bytes to G node_label = i['Spec'].get('Labels') if isinstance(node_label, dict): _node_label = '' for k,v in node_label.iteritems(): _node_label += '%s=%s, ' %(k, v) node_label = _node_label.strip(' ,') node_CreatedAt = timeChange(i['CreatedAt']) node_UpdatedAt = timeChange(i['UpdatedAt']) node_dockerVersion = i['Description']['Engine']['EngineVersion'] node_indexVersion = i.get("Version", {}).get("Index") except Exception,e: logger.error(e, exc_info=True) logger.debug(i) node_host = i.get('ManagerStatus', {}).get('Addr', '').split(':')[0] or i['Spec'].get('Labels', {}).get('ipaddr', i['Description']['Hostname']) node_data.append((node_host, i.get("ID"))) else: node_data.append((node_host, node_id, node_role, node_status, node_availability, node_reachability, node_containers, node_cpu, node_mem, node_label, node_CreatedAt, node_UpdatedAt, node_dockerVersion)) res.update(data=node_data)