{"action":"created","comment":{"url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/comments/165383008","pull_request_review_id":93311890,"id":165383008,"diff_hunk":"@@ -8,111 +8,134 @@ import (\n \t\"github.com/turbonomic/kubeturbo/pkg/discovery/repository\"\n \t\"github.com/turbonomic/kubeturbo/pkg/discovery/util\"\n \t\"github.com/turbonomic/kubeturbo/pkg/kubeclient\"\n-\t\"math/rand\"\n+\t\"k8s.io/client-go/pkg/api/v1\"\n \t\"strings\"\n )\n \n-// Class to query the cluster data from the Kubernetes API server and create the KubeCluster entity\n-// to represent the cluster, the nodes and the namespaces.\n+// Top level object that will connect to the Kubernetes cluster and all the nodes in the cluster.\n+// It will also query the cluster data from the Kubernetes API server and create the KubeCluster\n+// entity  to represent the cluster, the nodes and the namespaces.\n type ClusterProcessor struct {\n-\tClusterInfoScraper *cluster.ClusterScraper\n-\tNodeScrapper       *kubeclient.KubeletClient\n+\tclusterInfoScraper cluster.ClusterScraperInterface\n+\tnodeScrapper       kubeclient.KubeHttpClientInterface\n }\n \n-// Query the Kubernetes API Server to get the cluster nodes and namespaces.\n-func (processor *ClusterProcessor) ConnectCluster(checkAllNodes bool) (*repository.KubeCluster, error) {\n-\tsvcID, err := processor.ClusterInfoScraper.GetKubernetesServiceID()\n+func NewClusterProcessor(kubeClient *cluster.ClusterScraper, kubeletClient *kubeclient.KubeletClient) *ClusterProcessor {\n+\tif kubeClient == nil {\n+\t\tglog.Errorf(\"Null kubeclient while creating cluster processor\")\n+\t\treturn nil\n+\t}\n+\tif kubeletClient == nil {\n+\t\tglog.Errorf(\"Null kubeletclient while creating cluster processor\")\n+\t\treturn nil\n+\t}\n+\tclusterProcessor := &ClusterProcessor{\n+\t\tclusterInfoScraper: kubeClient,\n+\t\tnodeScrapper:       kubeletClient,\n+\t}\n+\treturn clusterProcessor\n+}\n+\n+// Connects to the Kubernetes API Server and the nodes in the cluster.\n+// If connection is successful a KubeCluster entity to represent the cluster is created\n+func (processor *ClusterProcessor) ConnectCluster() (*repository.KubeCluster, error) {\n+\tif processor.clusterInfoScraper == nil || processor.nodeScrapper == nil {\n+\t\treturn nil, fmt.Errorf(\"Null kubernetes cluster or node client\")\n+\t}\n+\n+\tsvcID, err := processor.clusterInfoScraper.GetKubernetesServiceID()\n \tif err != nil {\n \t\treturn nil, fmt.Errorf(\"Cannot obtain service ID for cluster %s\\n\", err)\n \t}\n \tkubeCluster := repository.NewKubeCluster(svcID)\n+\tglog.V(4).Infof(\"Created cluster %s\\n\", svcID)\n \n \t// Nodes\n-\terr = processor.ConnectToNodes(checkAllNodes)\n+\terr = processor.connectToNodes()\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n \n \treturn kubeCluster, err\n }\n \n-func (processor *ClusterProcessor) ConnectToNodes(checkAllNodes bool) error {\n-\tnodeList, err := processor.ClusterInfoScraper.GetAllNodes()\n+// Connects to all nodes in the cluster.\n+// Obtains the CPU Frequency of the node to determine the node availability and accessibility.\n+func (processor *ClusterProcessor) connectToNodes() error {\n+\tnodeList, err := processor.clusterInfoScraper.GetAllNodes()\n \tif err != nil {\n \t\treturn fmt.Errorf(\"Error getting nodes for cluster : %s\\n\", err)\n \t}\n \tglog.V(2).Infof(\"There are %d nodes\\n\", len(nodeList))\n \n-\tvar connectionErrors []error\n+\tvar connectionErrors []string\n \tvar connectionMsgs []string\n \n-\tn := rand.Int() % len(nodeList)\n-\tfor idx, node := range nodeList {\n-\t\tif !checkAllNodes && idx != n {\n-\t\t\tcontinue\n-\t\t}\n-\t\tip := repository.ParseNodeIP(node)\n-\t\tkc := processor.NodeScrapper\n-\t\tcpuFreq, err := kc.GetMachineCpuFrequency(ip)\n+\tfor _, node := range nodeList {\n+\t\tnodeCpuFrequency, err := checkNode(node, processor.nodeScrapper)\n \n \t\tif err != nil {\n-\t\t\tconnectionErrors = append(connectionErrors, fmt.Errorf(\"%s:%s\", node.Name, err))\n+\t\t\tconnectionErrors = append(connectionErrors, fmt.Sprintf(\"%s:%s\", node.Name, err))","path":"pkg/discovery/processor/cluster_processor.go","position":null,"original_position":92,"commit_id":"5cd9c6149b5640dddfd60be063aea849b4143dfb","original_commit_id":"300613c8e98547e8c5a9ca90f361e9f98cada9b2","user":{"login":"maxwangvmt","id":12261551,"avatar_url":"https://avatars3.githubusercontent.com/u/12261551?v=4","gravatar_id":"","url":"https://api.github.com/users/maxwangvmt","html_url":"https://github.com/maxwangvmt","followers_url":"https://api.github.com/users/maxwangvmt/followers","following_url":"https://api.github.com/users/maxwangvmt/following{/other_user}","gists_url":"https://api.github.com/users/maxwangvmt/gists{/gist_id}","starred_url":"https://api.github.com/users/maxwangvmt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxwangvmt/subscriptions","organizations_url":"https://api.github.com/users/maxwangvmt/orgs","repos_url":"https://api.github.com/users/maxwangvmt/repos","events_url":"https://api.github.com/users/maxwangvmt/events{/privacy}","received_events_url":"https://api.github.com/users/maxwangvmt/received_events","type":"User","site_admin":false},"body":"If we fail connecting to the node, it will be helpful to know the node status. So, we can also add node.Status in the message.","created_at":"2018-02-01T15:06:09Z","updated_at":"2018-02-01T15:06:20Z","html_url":"https://github.com/turbonomic/kubeturbo/pull/150#discussion_r165383008","pull_request_url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/comments/165383008"},"html":{"href":"https://github.com/turbonomic/kubeturbo/pull/150#discussion_r165383008"},"pull_request":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150"}}},"pull_request":{"url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150","id":165463750,"html_url":"https://github.com/turbonomic/kubeturbo/pull/150","diff_url":"https://github.com/turbonomic/kubeturbo/pull/150.diff","patch_url":"https://github.com/turbonomic/kubeturbo/pull/150.patch","issue_url":"https://api.github.com/repos/turbonomic/kubeturbo/issues/150","number":150,"state":"open","locked":false,"title":"Connect to cluster and nodes during kubeturo target validation","user":{"login":"pallavidn","id":11964436,"avatar_url":"https://avatars0.githubusercontent.com/u/11964436?v=4","gravatar_id":"","url":"https://api.github.com/users/pallavidn","html_url":"https://github.com/pallavidn","followers_url":"https://api.github.com/users/pallavidn/followers","following_url":"https://api.github.com/users/pallavidn/following{/other_user}","gists_url":"https://api.github.com/users/pallavidn/gists{/gist_id}","starred_url":"https://api.github.com/users/pallavidn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pallavidn/subscriptions","organizations_url":"https://api.github.com/users/pallavidn/orgs","repos_url":"https://api.github.com/users/pallavidn/repos","events_url":"https://api.github.com/users/pallavidn/events{/privacy}","received_events_url":"https://api.github.com/users/pallavidn/received_events","type":"User","site_admin":false},"body":"- Moved location of KubeletClient.\r\n- Added methods to ClusterProcessor to access the Kuberentes API Server to get all nodes and then to access each node using kubeletClient. This is used to validate the kubeturbo target.\r\n- Created interfaces for ClusterInfoScrapper and KubeletClient, to add unit tests for ClusterProcesor.\r\n- Added unit tests for ClusterProcessor.","created_at":"2018-01-26T21:22:36Z","updated_at":"2018-02-01T15:06:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c79d7f6f6b61f4279fe5753bf9cedcb2078f2574","assignee":null,"assignees":[],"requested_reviewers":[{"login":"enlinxu","id":4391815,"avatar_url":"https://avatars1.githubusercontent.com/u/4391815?v=4","gravatar_id":"","url":"https://api.github.com/users/enlinxu","html_url":"https://github.com/enlinxu","followers_url":"https://api.github.com/users/enlinxu/followers","following_url":"https://api.github.com/users/enlinxu/following{/other_user}","gists_url":"https://api.github.com/users/enlinxu/gists{/gist_id}","starred_url":"https://api.github.com/users/enlinxu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enlinxu/subscriptions","organizations_url":"https://api.github.com/users/enlinxu/orgs","repos_url":"https://api.github.com/users/enlinxu/repos","events_url":"https://api.github.com/users/enlinxu/events{/privacy}","received_events_url":"https://api.github.com/users/enlinxu/received_events","type":"User","site_admin":false},{"login":"songbinliu","id":27221807,"avatar_url":"https://avatars2.githubusercontent.com/u/27221807?v=4","gravatar_id":"","url":"https://api.github.com/users/songbinliu","html_url":"https://github.com/songbinliu","followers_url":"https://api.github.com/users/songbinliu/followers","following_url":"https://api.github.com/users/songbinliu/following{/other_user}","gists_url":"https://api.github.com/users/songbinliu/gists{/gist_id}","starred_url":"https://api.github.com/users/songbinliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/songbinliu/subscriptions","organizations_url":"https://api.github.com/users/songbinliu/orgs","repos_url":"https://api.github.com/users/songbinliu/repos","events_url":"https://api.github.com/users/songbinliu/events{/privacy}","received_events_url":"https://api.github.com/users/songbinliu/received_events","type":"User","site_admin":false}],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150/commits","review_comments_url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150/comments","review_comment_url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/turbonomic/kubeturbo/issues/150/comments","statuses_url":"https://api.github.com/repos/turbonomic/kubeturbo/statuses/5cd9c6149b5640dddfd60be063aea849b4143dfb","head":{"label":"pallavidn:targetValidation","ref":"targetValidation","sha":"5cd9c6149b5640dddfd60be063aea849b4143dfb","user":{"login":"pallavidn","id":11964436,"avatar_url":"https://avatars0.githubusercontent.com/u/11964436?v=4","gravatar_id":"","url":"https://api.github.com/users/pallavidn","html_url":"https://github.com/pallavidn","followers_url":"https://api.github.com/users/pallavidn/followers","following_url":"https://api.github.com/users/pallavidn/following{/other_user}","gists_url":"https://api.github.com/users/pallavidn/gists{/gist_id}","starred_url":"https://api.github.com/users/pallavidn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pallavidn/subscriptions","organizations_url":"https://api.github.com/users/pallavidn/orgs","repos_url":"https://api.github.com/users/pallavidn/repos","events_url":"https://api.github.com/users/pallavidn/events{/privacy}","received_events_url":"https://api.github.com/users/pallavidn/received_events","type":"User","site_admin":false},"repo":{"id":74591164,"name":"kubeturbo","full_name":"pallavidn/kubeturbo","owner":{"login":"pallavidn","id":11964436,"avatar_url":"https://avatars0.githubusercontent.com/u/11964436?v=4","gravatar_id":"","url":"https://api.github.com/users/pallavidn","html_url":"https://github.com/pallavidn","followers_url":"https://api.github.com/users/pallavidn/followers","following_url":"https://api.github.com/users/pallavidn/following{/other_user}","gists_url":"https://api.github.com/users/pallavidn/gists{/gist_id}","starred_url":"https://api.github.com/users/pallavidn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pallavidn/subscriptions","organizations_url":"https://api.github.com/users/pallavidn/orgs","repos_url":"https://api.github.com/users/pallavidn/repos","events_url":"https://api.github.com/users/pallavidn/events{/privacy}","received_events_url":"https://api.github.com/users/pallavidn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pallavidn/kubeturbo","description":null,"fork":true,"url":"https://api.github.com/repos/pallavidn/kubeturbo","forks_url":"https://api.github.com/repos/pallavidn/kubeturbo/forks","keys_url":"https://api.github.com/repos/pallavidn/kubeturbo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pallavidn/kubeturbo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pallavidn/kubeturbo/teams","hooks_url":"https://api.github.com/repos/pallavidn/kubeturbo/hooks","issue_events_url":"https://api.github.com/repos/pallavidn/kubeturbo/issues/events{/number}","events_url":"https://api.github.com/repos/pallavidn/kubeturbo/events","assignees_url":"https://api.github.com/repos/pallavidn/kubeturbo/assignees{/user}","branches_url":"https://api.github.com/repos/pallavidn/kubeturbo/branches{/branch}","tags_url":"https://api.github.com/repos/pallavidn/kubeturbo/tags","blobs_url":"https://api.github.com/repos/pallavidn/kubeturbo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pallavidn/kubeturbo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pallavidn/kubeturbo/git/refs{/sha}","trees_url":"https://api.github.com/repos/pallavidn/kubeturbo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pallavidn/kubeturbo/statuses/{sha}","languages_url":"https://api.github.com/repos/pallavidn/kubeturbo/languages","stargazers_url":"https://api.github.com/repos/pallavidn/kubeturbo/stargazers","contributors_url":"https://api.github.com/repos/pallavidn/kubeturbo/contributors","subscribers_url":"https://api.github.com/repos/pallavidn/kubeturbo/subscribers","subscription_url":"https://api.github.com/repos/pallavidn/kubeturbo/subscription","commits_url":"https://api.github.com/repos/pallavidn/kubeturbo/commits{/sha}","git_commits_url":"https://api.github.com/repos/pallavidn/kubeturbo/git/commits{/sha}","comments_url":"https://api.github.com/repos/pallavidn/kubeturbo/comments{/number}","issue_comment_url":"https://api.github.com/repos/pallavidn/kubeturbo/issues/comments{/number}","contents_url":"https://api.github.com/repos/pallavidn/kubeturbo/contents/{+path}","compare_url":"https://api.github.com/repos/pallavidn/kubeturbo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pallavidn/kubeturbo/merges","archive_url":"https://api.github.com/repos/pallavidn/kubeturbo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pallavidn/kubeturbo/downloads","issues_url":"https://api.github.com/repos/pallavidn/kubeturbo/issues{/number}","pulls_url":"https://api.github.com/repos/pallavidn/kubeturbo/pulls{/number}","milestones_url":"https://api.github.com/repos/pallavidn/kubeturbo/milestones{/number}","notifications_url":"https://api.github.com/repos/pallavidn/kubeturbo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pallavidn/kubeturbo/labels{/name}","releases_url":"https://api.github.com/repos/pallavidn/kubeturbo/releases{/id}","deployments_url":"https://api.github.com/repos/pallavidn/kubeturbo/deployments","created_at":"2016-11-23T15:48:20Z","updated_at":"2016-11-23T15:48:22Z","pushed_at":"2018-01-31T21:51:44Z","git_url":"git://github.com/pallavidn/kubeturbo.git","ssh_url":"git@github.com:pallavidn/kubeturbo.git","clone_url":"https://github.com/pallavidn/kubeturbo.git","svn_url":"https://github.com/pallavidn/kubeturbo","homepage":null,"size":57903,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"turbonomic:master","ref":"master","sha":"1904b1d0c3c0fe024b20ca767c803f7caef82f72","user":{"login":"turbonomic","id":20601535,"avatar_url":"https://avatars3.githubusercontent.com/u/20601535?v=4","gravatar_id":"","url":"https://api.github.com/users/turbonomic","html_url":"https://github.com/turbonomic","followers_url":"https://api.github.com/users/turbonomic/followers","following_url":"https://api.github.com/users/turbonomic/following{/other_user}","gists_url":"https://api.github.com/users/turbonomic/gists{/gist_id}","starred_url":"https://api.github.com/users/turbonomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/turbonomic/subscriptions","organizations_url":"https://api.github.com/users/turbonomic/orgs","repos_url":"https://api.github.com/users/turbonomic/repos","events_url":"https://api.github.com/users/turbonomic/events{/privacy}","received_events_url":"https://api.github.com/users/turbonomic/received_events","type":"Organization","site_admin":false},"repo":{"id":56551519,"name":"kubeturbo","full_name":"turbonomic/kubeturbo","owner":{"login":"turbonomic","id":20601535,"avatar_url":"https://avatars3.githubusercontent.com/u/20601535?v=4","gravatar_id":"","url":"https://api.github.com/users/turbonomic","html_url":"https://github.com/turbonomic","followers_url":"https://api.github.com/users/turbonomic/followers","following_url":"https://api.github.com/users/turbonomic/following{/other_user}","gists_url":"https://api.github.com/users/turbonomic/gists{/gist_id}","starred_url":"https://api.github.com/users/turbonomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/turbonomic/subscriptions","organizations_url":"https://api.github.com/users/turbonomic/orgs","repos_url":"https://api.github.com/users/turbonomic/repos","events_url":"https://api.github.com/users/turbonomic/events{/privacy}","received_events_url":"https://api.github.com/users/turbonomic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/turbonomic/kubeturbo","description":null,"fork":false,"url":"https://api.github.com/repos/turbonomic/kubeturbo","forks_url":"https://api.github.com/repos/turbonomic/kubeturbo/forks","keys_url":"https://api.github.com/repos/turbonomic/kubeturbo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/turbonomic/kubeturbo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/turbonomic/kubeturbo/teams","hooks_url":"https://api.github.com/repos/turbonomic/kubeturbo/hooks","issue_events_url":"https://api.github.com/repos/turbonomic/kubeturbo/issues/events{/number}","events_url":"https://api.github.com/repos/turbonomic/kubeturbo/events","assignees_url":"https://api.github.com/repos/turbonomic/kubeturbo/assignees{/user}","branches_url":"https://api.github.com/repos/turbonomic/kubeturbo/branches{/branch}","tags_url":"https://api.github.com/repos/turbonomic/kubeturbo/tags","blobs_url":"https://api.github.com/repos/turbonomic/kubeturbo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/turbonomic/kubeturbo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/turbonomic/kubeturbo/git/refs{/sha}","trees_url":"https://api.github.com/repos/turbonomic/kubeturbo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/turbonomic/kubeturbo/statuses/{sha}","languages_url":"https://api.github.com/repos/turbonomic/kubeturbo/languages","stargazers_url":"https://api.github.com/repos/turbonomic/kubeturbo/stargazers","contributors_url":"https://api.github.com/repos/turbonomic/kubeturbo/contributors","subscribers_url":"https://api.github.com/repos/turbonomic/kubeturbo/subscribers","subscription_url":"https://api.github.com/repos/turbonomic/kubeturbo/subscription","commits_url":"https://api.github.com/repos/turbonomic/kubeturbo/commits{/sha}","git_commits_url":"https://api.github.com/repos/turbonomic/kubeturbo/git/commits{/sha}","comments_url":"https://api.github.com/repos/turbonomic/kubeturbo/comments{/number}","issue_comment_url":"https://api.github.com/repos/turbonomic/kubeturbo/issues/comments{/number}","contents_url":"https://api.github.com/repos/turbonomic/kubeturbo/contents/{+path}","compare_url":"https://api.github.com/repos/turbonomic/kubeturbo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/turbonomic/kubeturbo/merges","archive_url":"https://api.github.com/repos/turbonomic/kubeturbo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/turbonomic/kubeturbo/downloads","issues_url":"https://api.github.com/repos/turbonomic/kubeturbo/issues{/number}","pulls_url":"https://api.github.com/repos/turbonomic/kubeturbo/pulls{/number}","milestones_url":"https://api.github.com/repos/turbonomic/kubeturbo/milestones{/number}","notifications_url":"https://api.github.com/repos/turbonomic/kubeturbo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/turbonomic/kubeturbo/labels{/name}","releases_url":"https://api.github.com/repos/turbonomic/kubeturbo/releases{/id}","deployments_url":"https://api.github.com/repos/turbonomic/kubeturbo/deployments","created_at":"2016-04-19T00:21:30Z","updated_at":"2018-01-08T21:53:21Z","pushed_at":"2018-01-31T21:51:46Z","git_url":"git://github.com/turbonomic/kubeturbo.git","ssh_url":"git@github.com:turbonomic/kubeturbo.git","clone_url":"https://github.com/turbonomic/kubeturbo.git","svn_url":"https://github.com/turbonomic/kubeturbo","homepage":null,"size":57846,"stargazers_count":13,"watchers_count":13,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":11,"mirror_url":null,"archived":false,"open_issues_count":11,"license":null,"forks":11,"open_issues":11,"watchers":13,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150"},"html":{"href":"https://github.com/turbonomic/kubeturbo/pull/150"},"issue":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/issues/150"},"comments":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/issues/150/comments"},"review_comments":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150/comments"},"review_comment":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/pulls/150/commits"},"statuses":{"href":"https://api.github.com/repos/turbonomic/kubeturbo/statuses/5cd9c6149b5640dddfd60be063aea849b4143dfb"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"maxwangvmt"}}