def main()

in services/jenkins-slave-creation-windows/post-install.py [0:0]


def main():
    logging.getLogger().setLevel(logging.DEBUG)

    parser = argparse.ArgumentParser()
    parser.add_argument('-g', '--gpu',
                        help='GPU or CPU install',
                        default=False,
                        type=bool)
    args = parser.parse_args()

    # Visual Studio CE 2017
    # Path: C:\Program Files (x86)\Microsoft Visual Studio 14.0
    # Components: https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-community?view=vs-2017#visual-studio-core-editor-included-with-visual-studio-community-2017
    logging.info("Installing Visual Studio CE 2017...")
    with tempfile.TemporaryDirectory() as tmpdir:
        vs_file_path = download_file('https://aka.ms/eac464', tmpdir)
        run_command("PowerShell Rename-Item -Path {} -NewName \"{}.exe\"".format(vs_file_path, vs_file_path.split('\\')[-1]), shell=True)
        vs_file_path = vs_file_path + '.exe'
        run_command(vs_file_path \
        + ' --add Microsoft.VisualStudio.Workload.ManagedDesktop' \
        + ' --add Microsoft.VisualStudio.Workload.NetCoreTools' \
        + ' --add Microsoft.VisualStudio.Workload.NetWeb' \
        + ' --add Microsoft.VisualStudio.Workload.Node' \
        + ' --add Microsoft.VisualStudio.Workload.Office' \
        + ' --add Microsoft.VisualStudio.Component.TypeScript.2.0' \
        + ' --add Microsoft.VisualStudio.Component.TestTools.WebLoadTest' \
        + ' --add Component.GitHub.VisualStudio' \
        + ' --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core' \
        + ' --add Microsoft.VisualStudio.Component.Static.Analysis.Tools' \
        + ' --add Microsoft.VisualStudio.Component.VC.CMake.Project' \
        + ' --add Microsoft.VisualStudio.Component.VC.140' \
        + ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.Desktop' \
        + ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.UWP' \
        + ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.UWP.Native' \
        + ' --add Microsoft.VisualStudio.ComponentGroup.Windows10SDK.15063' \
        + ' --wait' \
        + ' --passive' \
        + ' --norestart'
        )
        # Workaround for --wait sometimes ignoring the subprocesses doing component installs
        timer = 0
        while {'vs_installer.exe', 'vs_installershell.exe', 'vs_setup_bootstrapper.exe'} & set(map(lambda process: process.name(), psutil.process_iter())):
            if timer % 60 == 0:
                logging.info("Waiting for Visual Studio to install for the last {} seconds".format(str(timer)))
            timer += 1
    # TODO: Change this to chocolatey install
    #     run_command('choco install virtualstudio2017community --install-arguments ' \
    #     ' --add Microsoft.VisualStudio.Workload.ManagedDesktop' \
    #     ' --add Microsoft.VisualStudio.Workload.NetCoreTools' \
    #     ' --add Microsoft.VisualStudio.Workload.NetWeb' \
    #     ' --add Microsoft.VisualStudio.Workload.Node' \
    #     ' --add Microsoft.VisualStudio.Workload.Office' \
    #     ' --add Microsoft.VisualStudio.Component.TypeScript.2.0' \
    #     ' --add Microsoft.VisualStudio.Component.TestTools.WebLoadTest' \
    #     ' --add Component.GitHub.VisualStudio' \
    #     ' --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core' \
    #     ' --add Microsoft.VisualStudio.Component.Static.Analysis.Tools' \
    #     ' --add Microsoft.VisualStudio.Component.VC.CMake.Project' \
    #     ' --add Microsoft.VisualStudio.Component.VC.140' \
    #     ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.Desktop' \
    #     ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.UWP' \
    #     ' --add Microsoft.VisualStudio.Component.Windows10SDK.15063.UWP.Native' \
    #     ' --add Microsoft.VisualStudio.ComponentGroup.Windows10SDK.15063' \
    #     )

    # CUDA 9.2 and patches
    logging.info("Installing CUDA 9.2 and Patches...")
    with tempfile.TemporaryDirectory() as tmpdir:
        cuda_9_2_file_path = download_file('https://developer.nvidia.com/compute/cuda/9.2/Prod2/network_installers2/cuda_9.2.148_win10_network', tmpdir)
        run_command("PowerShell Rename-Item -Path {} -NewName \"{}.exe\"".format(cuda_9_2_file_path, cuda_9_2_file_path.split('\\')[-1]), shell=True)
        cuda_9_2_file_path = cuda_9_2_file_path + '.exe'
        run_command(cuda_9_2_file_path \
        + ' -s nvcc_9.2' \
        + ' cuobjdump_9.2' \
        + ' nvprune_9.2' \
        + ' cupti_9.2' \
        + ' gpu_library_advisor_9.2' \
        + ' memcheck_9.2' \
        + ' nvdisasm_9.2' \
        + ' nvprof_9.2' \
        + ' visual_profiler_9.2' \
        + ' visual_studio_integration_9.2' \
        + ' demo_suite_9.2' \
        + ' documentation_9.2' \
        + ' cublas_9.2' \
        + ' cublas_dev_9.2' \
        + ' cudart_9.2' \
        + ' cufft_9.2' \
        + ' cufft_dev_9.2' \
        + ' curand_9.2' \
        + ' curand_dev_9.2' \
        + ' cusolver_9.2' \
        + ' cusolver_dev_9.2' \
        + ' cusparse_9.2' \
        + ' cusparse_dev_9.2' \
        + ' nvgraph_9.2' \
        + ' nvgraph_dev_9.2' \
        + ' npp_9.2' \
        + ' npp_dev_9.2' \
        + ' nvrtc_9.2' \
        + ' nvrtc_dev_9.2' \
        + ' nvml_dev_9.2' \
        + ' occupancy_calculator_9.2' \
        + ' {}'.format('Display.Driver' if args.gpu else '')
        )
        # Download patches and assume less than 100 patches exist
        for patch_number in range(1, 100):
            if patch_number == 100:
                raise Exception('Probable patch loop: CUDA patch downloader is downloading at least 100 patches!')
            cuda_9_2_patch_file_path = download_file("https://developer.nvidia.com/compute/cuda/9.2/Prod2/patches/{0}/cuda_9.2.148.{0}_windows".format(patch_number), tmpdir)
            if cuda_9_2_patch_file_path == 404:
                break
            run_command("PowerShell Rename-Item -Path {} -NewName \"{}.exe\"".format(cuda_9_2_patch_file_path, cuda_9_2_patch_file_path.split('\\')[-1]), shell=True)
            cuda_9_2_patch_file_path = cuda_9_2_patch_file_path + '.exe'
            run_command("{} -s".format(cuda_9_2_patch_file_path))

    # Git 2.18
    logging.info("Installing Git 2.18...")
    with tempfile.TemporaryDirectory() as tmpdir:
        git_file_path = download_file('https://github.com/git-for-windows/git/releases/download/v2.18.0.windows.1/Git-2.18.0-64-bit.exe', tmpdir)
        run_command("{} /VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS".format(git_file_path))

    # CMAKE 3.15
    logging.info("Installing CMAKE 3.15...")
    with tempfile.TemporaryDirectory() as tmpdir:
        cmake_file_path = download_file('https://cmake.org/files/v3.15/cmake-3.15.5-win64-x64.msi', tmpdir)
        run_command("msiexec /i {} /quiet /norestart ADD_CMAKE_TO_PATH=System".format(cmake_file_path))


    # OpenBLAS
    logging.info("Installing OpenBLAS 0.2.19...")
    with tempfile.TemporaryDirectory() as tmpdir:
        openblas_file_path = download_file('https://iweb.dl.sourceforge.net/project/openblas/v0.2.19/OpenBLAS-v0.2.19-Win64-int32.zip', tmpdir)
        openblas_extract_path = openblas_file_path.replace('.zip','')
        with zipfile.ZipFile(openblas_file_path, 'r') as zip:
            zip.extractall(openblas_extract_path)
        copy("{}\\OpenBLAS-v0.2.19-Win64-int32".format(openblas_extract_path), 'C:\\Program Files\\OpenBLAS-v0.2.19')


    # OpenCV
    logging.info("Installing OpenCV 3.4.1...")
    with tempfile.TemporaryDirectory() as tmpdir:
        opencv_file_path = download_file('https://phoenixnap.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.4.1/opencv-3.4.1-vc14_vc15.exe', tmpdir)
        opencv_extract_path = opencv_file_path.split('-')[0]
        run_command("{} -y -gm2".format(opencv_file_path))
        copy(opencv_extract_path, 'C:\\Program Files\\OpenCV-v3.4.1')
        shutil.rmtree(opencv_extract_path, onerror = on_rm_error)

    # Update Path
    logging.info("Adding Windows Kits to PATH...")
    current_path = run_command("PowerShell (Get-Itemproperty -path 'hklm:\\system\\currentcontrolset\\control\\session manager\\environment' -Name Path).Path")
    logging.debug("current_path: {}".format(current_path))
    new_path = current_path + ";C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.16299.0\\x86"
    logging.debug("new_path: {}".format(new_path))
    run_command("PowerShell Set-ItemProperty -path 'hklm:\\system\\currentcontrolset\\control\\session manager\\environment' -Name Path -Value '" + new_path + "'")

    # cuDNN
    logging.info("Installing cuDNN 9.2...")
    with tempfile.TemporaryDirectory() as tmpdir:
        with zipfile.ZipFile("C:\\cudnn-9.2-windows10-x64-v7.4.2.24.zip", 'r') as zip:
                zip.extractall(tmpdir)
        copy(tmpdir+"\\cuda\\bin\\cudnn64_7.dll","C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2\\bin")
        copy(tmpdir+"\\cuda\\include\\cudnn.h","C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2\\include")
        copy(tmpdir+"\\cuda\\lib\\x64\\cudnn.lib","C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2\\lib\\x64")
    os.remove("C:\\cudnn-9.2-windows10-x64-v7.4.2.24.zip")