Reviewed-by: Goncharov, Artem <artem.goncharov@t-systems.com> Co-authored-by: gtema <artem.goncharov@gmail.com> Co-committed-by: gtema <artem.goncharov@gmail.com>
		
			
				
	
	
		
			157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/python
 | 
						|
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
						|
# implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
import argparse
 | 
						|
import logging
 | 
						|
# import os
 | 
						|
import pathlib
 | 
						|
import subprocess
 | 
						|
# import warnings
 | 
						|
 | 
						|
# from git import exc
 | 
						|
from git import Repo
 | 
						|
# from git import SymbolicReference
 | 
						|
 | 
						|
# from jinja2 import PackageLoader
 | 
						|
# from jinja2 import Environment
 | 
						|
# from jinja2 import select_autoescape
 | 
						|
 | 
						|
from cookiecutter.main import cookiecutter
 | 
						|
 | 
						|
import otc_metadata.services
 | 
						|
 | 
						|
data = otc_metadata.services.Services()
 | 
						|
 | 
						|
 | 
						|
def create_repo(repo, repo_dir, service):
 | 
						|
    repo_owner, repo_name = repo["repo"].split("/")
 | 
						|
    git_repo = None
 | 
						|
 | 
						|
    if repo_dir.exists():
 | 
						|
        logging.debug(f"Repository {repo['repo']} is already existing")
 | 
						|
        return
 | 
						|
 | 
						|
    logging.info(f"Creating repository {repo_owner}/{repo_name}")
 | 
						|
    if repo["type"] == "gitea":
 | 
						|
        repo_url = (
 | 
						|
            f"ssh://git@gitea.eco.tsi-dev.otc-service.com:2222/"
 | 
						|
            f"{repo['repo']}"
 | 
						|
        )
 | 
						|
        git_fqdn = "gitea.eco.tsi-dev.otc-service.com"
 | 
						|
    elif repo["type"] == "github":
 | 
						|
        repo_url = f"git@github.com:/{repo['repo']}"
 | 
						|
        git_fqdn = "github.com"
 | 
						|
 | 
						|
    try:
 | 
						|
        git_repo = Repo.clone_from(repo_url, repo_dir, branch="main")
 | 
						|
    except Exception:
 | 
						|
        logging.debug("Error")
 | 
						|
        pass
 | 
						|
 | 
						|
    if git_repo:
 | 
						|
        return
 | 
						|
 | 
						|
    if repo["type"] == "gitea":
 | 
						|
        subprocess.run(
 | 
						|
            args=[
 | 
						|
                "tea",
 | 
						|
                "repo",
 | 
						|
                "create",
 | 
						|
                "--name",
 | 
						|
                repo_name,
 | 
						|
                "--owner",
 | 
						|
                repo_owner,
 | 
						|
            ]
 | 
						|
        )
 | 
						|
    elif repo["type"] == "github":
 | 
						|
        subprocess.run(
 | 
						|
            args=[
 | 
						|
                "gh",
 | 
						|
                "repo",
 | 
						|
                "create",
 | 
						|
                repo["repo"],
 | 
						|
                "--public",
 | 
						|
            ]
 | 
						|
        )
 | 
						|
    cookiecutter(
 | 
						|
        template="https://github.com/opentelekomcloud/docs-cookiecutter",
 | 
						|
        output_dir=repo_dir.parent,
 | 
						|
        no_input=True,
 | 
						|
        extra_context=dict(
 | 
						|
            git_fqdn=git_fqdn,
 | 
						|
            repo_group=repo_owner,
 | 
						|
            repo_name=repo_name,
 | 
						|
            project_short_description=(
 | 
						|
                f"Documentation project for {service['service_title']} "
 | 
						|
                "service"
 | 
						|
            ),
 | 
						|
            overwrite_if_exists=True,
 | 
						|
        ),
 | 
						|
    )
 | 
						|
    git_repo = Repo(repo_dir)
 | 
						|
    git_repo.create_remote("origin", repo_url)
 | 
						|
    git_repo.remotes.origin.fetch()
 | 
						|
    git_repo.git.push("--set-upstream", "origin", "main")
 | 
						|
 | 
						|
 | 
						|
def process_repositories(args, service):
 | 
						|
    """Checkout repositories"""
 | 
						|
    logging.debug(f"Processing service {service}")
 | 
						|
    workdir = pathlib.Path(args.work_dir)
 | 
						|
    workdir.mkdir(exist_ok=True)
 | 
						|
 | 
						|
    for repo in service["repositories"]:
 | 
						|
        logging.debug(f"Processing repository {repo}")
 | 
						|
        repo_dir = pathlib.Path(workdir, repo["type"], repo["repo"])
 | 
						|
 | 
						|
        if repo["environment"] != args.target_environment:
 | 
						|
            continue
 | 
						|
 | 
						|
        checkout_exists = repo_dir.exists()
 | 
						|
        logging.debug(f"Repository {repo} exists {checkout_exists}")
 | 
						|
        repo_dir.parent.mkdir(parents=True, exist_ok=True)
 | 
						|
        if True:  # not checkout_exists:
 | 
						|
            create_repo(repo, repo_dir, service)
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = argparse.ArgumentParser(description="Bootstrap repositories.")
 | 
						|
    parser.add_argument(
 | 
						|
        "--target-environment",
 | 
						|
        required=True,
 | 
						|
        help="Environment to be used as a source",
 | 
						|
    )
 | 
						|
    parser.add_argument("--service-type", help="Service to update")
 | 
						|
    parser.add_argument(
 | 
						|
        "--work-dir",
 | 
						|
        required=True,
 | 
						|
        help="Working directory to use for repository checkout.",
 | 
						|
    )
 | 
						|
 | 
						|
    args = parser.parse_args()
 | 
						|
    logging.basicConfig(level=logging.DEBUG)
 | 
						|
    services = []
 | 
						|
    if args.service_type:
 | 
						|
        services = [data.service_dict.get(args.service_type)]
 | 
						|
    else:
 | 
						|
        services = data.all_services
 | 
						|
 | 
						|
    for service in services:
 | 
						|
        process_repositories(args, service)
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |