-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Copied container from https://github.com/jskeet/google-cloud-dotnet/tree/docker-generate/picard
- Loading branch information
Showing
8 changed files
with
303 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# Copyright 2024 Google LLC | ||
# | ||
# 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. | ||
|
||
FROM mcr.microsoft.com/dotnet/sdk:6.0.414-jammy AS build | ||
|
||
# TODO: We're currently bundling MakeItSo into the Docker image | ||
# itself. This avoids having to make assumptions based on the | ||
# command-line arguments, but leaves scope for inconsistency. At the | ||
# moment, nothing *else* is in the Docker image... we could | ||
# potentially include "everything needed for an unconfigured API" in | ||
# the image, so that we could generate (but probably not build) an | ||
# arbitrary library. | ||
|
||
WORKDIR /src | ||
COPY . ./ | ||
RUN dotnet build MakeItSo/MakeItSo.csproj -c Release | ||
|
||
FROM mcr.microsoft.com/dotnet/sdk:6.0.414-jammy | ||
|
||
# Additional tooling required to regenerate libraries and project files. | ||
RUN apt-get update | ||
RUN apt-get install -y unzip | ||
|
||
WORKDIR /app | ||
COPY --from=build /src/MakeItSo/bin/Release/net6.0 . | ||
ENTRYPOINT ["dotnet", "MakeItSo.dll"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
namespace MakeItSo; | ||
|
||
/// <summary> | ||
/// // A very cut-down version of the code in Google.Cloud.Tools.Common. | ||
/// </summary> | ||
internal class ApiCatalog | ||
{ | ||
/// <summary> | ||
/// The APIs within the catalog. | ||
/// </summary> | ||
public List<ApiMetadata> Apis { get; set; } = null!; | ||
|
||
/// <summary> | ||
/// Proto paths for APIs we knowingly don't generate. The values are the reasons for not generating. | ||
/// </summary> | ||
public Dictionary<string, string> IgnoredPaths { get; set; } = null!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
namespace MakeItSo; | ||
|
||
// A very cut-down version of the code in Google.Cloud.Tools.Common. | ||
internal class ApiMetadata | ||
{ | ||
public string Id { get; set; } = null!; | ||
public string ProtoPath { get; set; } = null!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
namespace MakeItSo; | ||
|
||
internal class CreateCommand : ICommand | ||
{ | ||
private readonly string _apiRoot; | ||
private readonly string _api; | ||
private readonly string _outputRoot; | ||
|
||
public CreateCommand(string apiRoot, string api, string outputRoot) | ||
{ | ||
_apiRoot = apiRoot; | ||
_api = api; | ||
_outputRoot = outputRoot; | ||
} | ||
|
||
public void Execute() => throw new NotImplementedException(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
namespace MakeItSo; | ||
|
||
internal interface ICommand | ||
{ | ||
void Execute(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>net6.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
|
||
// Quick and dirty prototype for an entry point for containerized generation. | ||
|
||
using MakeItSo; | ||
|
||
var namedArgs = new Dictionary<string, string>(); | ||
|
||
foreach (var arg in args) | ||
{ | ||
if (!arg.StartsWith("--")) | ||
{ | ||
Console.WriteLine($"Invalid argument: {arg}"); | ||
return 1; | ||
} | ||
else | ||
{ | ||
var split = arg.Split('=', 2); | ||
if (split.Length != 2) | ||
{ | ||
Console.WriteLine($"Invalid argument: {arg}"); | ||
return 1; | ||
} | ||
namedArgs[split[0][2..]] = split[1]; | ||
} | ||
} | ||
|
||
var commandName = namedArgs.GetValueOrDefault("command"); | ||
if (commandName is null) | ||
{ | ||
Console.WriteLine("No command specified."); | ||
ShowHelp(); | ||
return 1; | ||
} | ||
|
||
ICommand? command; | ||
try | ||
{ | ||
command = namedArgs["command"] switch | ||
{ | ||
"create" => new CreateCommand(namedArgs["api-root"], namedArgs["api"], namedArgs["output-root"]), | ||
"update" => new UpdateCommand(namedArgs["api-root"], namedArgs["api"], namedArgs["output-root"]), | ||
_ => null | ||
}; | ||
} | ||
catch (KeyNotFoundException ex) | ||
{ | ||
Console.WriteLine(ex.Message); | ||
ShowHelp(); | ||
return 1; | ||
} | ||
|
||
if (command is null) | ||
{ | ||
Console.WriteLine($"Unknown command: {namedArgs["command"]}"); | ||
ShowHelp(); | ||
return 1; | ||
} | ||
|
||
try | ||
{ | ||
command.Execute(); | ||
} | ||
catch (Exception e) | ||
{ | ||
Console.WriteLine($"Error executing command: {e}"); | ||
return 1; | ||
} | ||
|
||
return 0; | ||
|
||
void ShowHelp() | ||
{ | ||
Console.WriteLine("Valid commands:"); | ||
Console.WriteLine("--command=update --api-root=path-to-apis --api=relative-path-to-api --output-root=path-to-dotnet-repo"); | ||
Console.WriteLine("--command=create --api-root=path-to-apis --api=relative-path-to-api --output-root=path-to-dotnet-repo"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// Copyright 2024 Google LLC | ||
// | ||
// 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 | ||
// | ||
// https://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. | ||
|
||
using Newtonsoft.Json; | ||
using Newtonsoft.Json.Linq; | ||
using System.Diagnostics; | ||
|
||
namespace MakeItSo; | ||
|
||
internal class UpdateCommand : ICommand | ||
{ | ||
private readonly string _apiRoot; | ||
private readonly string _api; | ||
private readonly string _outputRoot; | ||
|
||
public UpdateCommand(string apiRoot, string api, string outputRoot) | ||
{ | ||
_apiRoot = apiRoot; | ||
_api = api; | ||
_outputRoot = outputRoot; | ||
} | ||
|
||
public void Execute() | ||
{ | ||
var apiCatalogJson = File.ReadAllText(Path.Combine(_outputRoot, "apis", "apis.json")); | ||
var apiCatalog = JsonConvert.DeserializeObject<ApiCatalog>(apiCatalogJson)!; | ||
var api = apiCatalog.Apis.FirstOrDefault(api => api.ProtoPath == _api); | ||
if (api is null) | ||
{ | ||
throw new Exception($"No API configured with proto path {_api}"); | ||
} | ||
|
||
var psi = new ProcessStartInfo | ||
{ | ||
FileName = "/bin/bash", | ||
ArgumentList = { "./generateapis.sh", api.Id }, | ||
WorkingDirectory = _outputRoot, | ||
EnvironmentVariables = { { "GOOGLEAPIS_DIR", _apiRoot } } | ||
}; | ||
var process = Process.Start(psi)!; | ||
process.WaitForExit(); | ||
if (process.ExitCode != 0) | ||
{ | ||
throw new Exception($"Generation ended with exit code {process.ExitCode}"); | ||
} | ||
} | ||
} |