Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v1.0.0
Empty file.
51 changes: 51 additions & 0 deletions src/plugin/connector/organization/repository_connector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from .. import RequestConnector
import logging


class OrgRepositoryConnector(RequestConnector):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def list_repositories(self, secret_data):
headers = self.make_header(secret_data)
url = (
f"https://api.github.com/orgs/{secret_data.get('organization_name')}/repos"
)
response = self.send_request(url, headers, page=1)
return response

def list_repository_issues(self, repo, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/repos/{secret_data.get('organization_name')}/{repo}/issues"
response = self.send_request(url, headers, page=1)
return response

def get_repository_languages(self, repo, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/repos/{secret_data.get('organization_name')}/{repo}/languages"
response = self.send_request(url, headers)
return response

def get_repository_contributors(self, repo, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/repos/{secret_data.get('organization_name')}/{repo}/contributors"
response = self.send_request(url, headers)
return response

def list_repository_branches(self, repo, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/repos/{secret_data.get('organization_name')}/{repo}/branches"
response = self.send_request(url, headers, page=1)
return response

def list_repository_forks(self, repo, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/repos/{secret_data.get('organization_name')}/{repo}/forks"
response = self.send_request(url, headers, page=1)
return response

def get_user(self, user, secret_data):
headers = self.make_header(secret_data)
url = f"https://api.github.com/users/{user}"
response = self.send_request(url, headers)
return response
40 changes: 17 additions & 23 deletions src/plugin/main.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import logging

from spaceone.inventory.plugin.collector.lib.server import CollectorPluginServer
from plugin.manager.organization.repository_manager import OrgRepositoryManager

_LOGGER = logging.getLogger("cloudforet")

app = CollectorPluginServer()


@app.route('Collector.init')
@app.route("Collector.init")
def collector_init(params: dict) -> dict:
""" init plugin by options
"""init plugin by options

Args:
params (CollectorInitRequest): {
Expand All @@ -19,30 +23,13 @@ def collector_init(params: dict) -> dict:
'metadata': 'dict'
}
"""
pass


@app.route('Collector.verify')
def collector_verify(params: dict) -> None:
""" Verifying collector plugin

Args:
params (CollectorVerifyRequest): {
'options': 'dict', # Required
'secret_data': 'dict', # Required
'schema': 'str',
'domain_id': 'str'
}

Returns:
None
"""
pass
return {"metadata": {}}


@app.route('Collector.collect')
@app.route("Collector.collect")
def collector_collect(params: dict) -> dict:
""" Collect external data
"""Collect external data

Args:
params (CollectorCollectRequest): {
Expand All @@ -63,4 +50,11 @@ def collector_collect(params: dict) -> dict:
'metadata': 'dict'
}
"""
pass

options = params["options"]
secret_data = params["secret_data"]
schema = params.get("schema")

org_repository_manager = OrgRepositoryManager()
# return org_repository_manager.collect_cloud_service_type(options, secret_data, schema)
return org_repository_manager.collect_resources(options, secret_data, schema)
Empty file added src/plugin/manager/__init__.py
Empty file.
Empty file.
142 changes: 142 additions & 0 deletions src/plugin/manager/organization/repository_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import logging
from spaceone.inventory.plugin.collector.lib import *

from ...connector.organization.repository_connector import OrgRepositoryConnector

_LOGGER = logging.getLogger("cloudforet")


class OrgRepositoryManager:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.cloud_service_group = "Organization"
self.cloud_service_type = "Repository"
self.provider = "github_wanjin"
self.metadata_path = "metadata/organization/repository.yaml"

def collect_resources(self, options, secret_data, schema):
try:
yield from self.collect_cloud_service_type(options, secret_data, schema)
yield from self.collect_cloud_service(options, secret_data, schema)
except Exception as e:
yield make_error_response(
error=e,
provider=self.provider,
cloud_service_group=self.cloud_service_group,
cloud_service_type=self.cloud_service_type,
)

def collect_cloud_service_type(self, options, secret_data, schema):
try:
cloud_service_type = make_cloud_service_type(
name=self.cloud_service_type,
group=self.cloud_service_group,
provider=self.provider,
metadata_path=self.metadata_path,
is_primary=True,
is_major=True,
tags={
"spaceone:icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png"
},
)

yield make_response(
cloud_service_type=cloud_service_type,
match_keys=[["name", "reference.resource_id", "account", "provider"]],
resource_type="inventory.CloudServiceType",
)

except Exception as e:
yield make_error_response(
error=e,
provider=self.provider,
cloud_service_group=self.cloud_service_group,
cloud_service_type=self.cloud_service_type,
)

def collect_cloud_service(self, options, secret_data, schema):
try:
org_repository_connector = OrgRepositoryConnector()
repo_items = org_repository_connector.list_repositories(secret_data)
for item in repo_items:
# get issues
issue_items = org_repository_connector.list_repository_issues(
item["name"], secret_data
)
item["issues"] = list(issue_items)

# get languages
(language_info,) = org_repository_connector.get_repository_languages(
item["name"], secret_data
)
languages = []
for key, value in language_info.items():
languages.append({"language": key, "bytes": value})
item["languages"] = languages

# get contributors
(
contributor_items,
) = org_repository_connector.get_repository_contributors(
item["name"], secret_data
)
contributors_info = []
# get contributors info
for contributor_item in contributor_items:
(contributor_info,) = org_repository_connector.get_user(
contributor_item["login"], secret_data
)
contributor_info["contributions"] = contributor_item["contributions"]
contributors_info.append(contributor_info)
item["contributors"] = contributors_info

# get branches
branch_items = org_repository_connector.list_repository_branches(
item["name"], secret_data
)
item["branches"] = list(branch_items)

# get forks
fork_items = org_repository_connector.list_repository_forks(
item["name"], secret_data
)
forks_info = []
# get forked repo owners info
for fork_item in fork_items:
(owner_info,) = org_repository_connector.get_user(
fork_item["owner"]["login"], secret_data
)
forks_info.append(
{
"name": fork_item["name"],
"description": fork_item["description"],
"html_url": fork_item["html_url"],
"open_issues_count": fork_item["open_issues_count"],
"forks_count": fork_item["forks_count"],
"owner_info": owner_info,
}
)
item["forks_info"] = forks_info

cloud_service = make_cloud_service(
name=item["name"],
cloud_service_type=self.cloud_service_type,
cloud_service_group=self.cloud_service_group,
provider=self.provider,
data=item,
)

yield make_response(
cloud_service=cloud_service,
match_keys=[
["name", "reference.resource_id", "account", "provider"]
],
)
except Exception as e:
yield make_error_response(
error=e,
provider=self.provider,
cloud_service_group=self.cloud_service_group,
cloud_service_type=self.cloud_service_type,
)
Empty file added src/plugin/metadata/__init__.py
Empty file.
Empty file.
122 changes: 122 additions & 0 deletions src/plugin/metadata/organization/repository.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
search:
fields:
- Description: data.description
- Url: data.html_url
- Topics: data.topics
- Language: data.language


table:
sort:
key: data.created_at
desc: true
fields:
- Name: data.name
link: data.html_url
- Description: data.description
- Url: data.html_url
- Topics: data.topics
- Language: data.language
type: badge
outline_color: blue.500
text_color: blue.500
- Open Issues Count: data.open_issues_count
- Forks Count: data.forks_count
- Stargazers Count: data.stargazers_count
- Watchers Count: data.watchers_count


tabs.0:
name: Issues
type: list
items:
- name: Issues
type: table
root_path: data.issues
fields:
- Number: number
- Title: title
link: html_url
- State: state
type: enum
enums:
- open: green.500
- closed: red.500
- Labels: labels.name
- Assignees: assignees.login
- Comments Count: comments

tabs.1:
name: Languages
type: list
items:
- name: Languages
type: simple-table
root_path: data.languages
fields:
- Language: language
type: badge
outline_color: blue.500
text_color: blue.500
- Bytes of Code: bytes
type: size
display_unit: MB
source_unit: BYTES


tabs.2:
name: Contributors
type: list
items:
- name: Contributors
type: simple-table
root_path: data.contributors
fields:
- Name: name
- Contributions: contributions
- Github Url: html_url
- Email: email
- Company: company
- Location: location
- Followers: followers
- Following: following

tabs.3:
name: Branches
type: list
items:
- name: Branches
type: simple-table
root_path: data.branches
fields:
- Name: name
- Protected: protected
- Commit: commit.sha
link: commit.url

tabs.4:
name: Forks
type: list
items:
- name: Forked Repos
type: simple-table
root_path: data.forks_info
fields:
- Name: name
- Github Url: html_url
- Owner: owner_info.login
- Open Issues Count: open_issues_count
- Forks Count: forks_count
- name: Forked Repo Owners
type: simple-table
root_path: data.forks_info.owner_info
fields:
- Name: name
- ID: login
- Email: email
- Github Url: html_url
- Company: company
- Location: location
- Followers: followers
- Following: following
Loading