Skip to content

Commit 6d04e52

Browse files
authored
Bugfixes (#7)
1 parent 8bcdba1 commit 6d04e52

18 files changed

+383
-322
lines changed

examples/SimpleOperator/Program.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
using K8sOperator.NET;
22
using K8sOperator.NET.Extensions;
3-
using K8sOperator.NET.Generator.Builders;
43
using SimpleOperator.Projects;
54

65
var builder = OperatorHost.CreateOperatorApplicationBuilder(args);
76

8-
//builder.WithName("sonarcube-operator");
9-
//builder.WithImage(
10-
// repository: "pmdevers",
11-
// name: "sonarcube-operator",
12-
// tag: "fc5d6122d6ff1057062e368214ddf4cfe34f5d6d"
13-
//);
7+
builder.WithName("simple-operator");
8+
builder.WithImage(repository: "pmdevers", name: "simple-operator", tag: "1.0.0");
149

1510
builder.AddController<TestItemController>()
1611
.WithFinalizer("testitem.local.finalizer");

examples/SimpleOperator/Projects/ProjectController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace SimpleOperator.Projects;
66

77

8-
public class ProjectController(IKubernetes client, ILoggerFactory logger) : Controller<Project>
8+
public class ProjectController(ILoggerFactory logger) : Controller<Project>
99
{
1010
private readonly ILogger _logger = logger.CreateLogger<ProjectController>();
1111

examples/SimpleOperator/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"install": {
1414
"commandName": "Project",
15-
"commandLineArgs": "install --export",
15+
"commandLineArgs": "install --export > simple-operator-system.yaml",
1616
"launchBrowser": true,
1717
"environmentVariables": {
1818
"ASPNETCORE_ENVIRONMENT": "Development"

examples/SimpleOperator/SimpleOperator.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
<TargetFramework>net8.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
7-
<Company>Pmdevers</Company>
8-
<Product>simple-operator</Product>
7+
<Company>pmdevers</Company>
8+
<OperatorName>simple-operator</OperatorName>
99
</PropertyGroup>
1010

1111
<ItemGroup>
1212
<ProjectReference Include="..\..\src\K8sOperator.NET\K8sOperator.NET.csproj" />
1313
</ItemGroup>
1414

15-
15+
1616
</Project>

src/K8sOperator.NET/Builder/IOperatorHostBuilder.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,16 @@ internal OperatorApplicationBuilder(string[] args)
4545

4646
private void ConfigureMetadata()
4747
{
48-
var company = Assembly.GetEntryAssembly()?.GetCustomAttribute<AssemblyCompanyAttribute>()?.Company ?? "";
49-
var product = Assembly.GetEntryAssembly()?.GetCustomAttribute<AssemblyProductAttribute>()?.Product ?? "";
50-
var version = Assembly.GetEntryAssembly()?.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version ?? "1.0.0";
51-
52-
_metadata.Add(new OperatorNameMetadata(product.ToLower()));
53-
_metadata.Add(new ImageMetadata(
54-
registery: "ghcr.io",
55-
repository: company.ToLower(),
56-
imageName: product.ToLower(),
57-
tag: version.ToLower()
58-
));
48+
49+
var operatorName = Assembly.GetEntryAssembly()?.GetCustomAttribute<OperatorNameAttribute>()
50+
?? new OperatorNameAttribute("operator");
51+
52+
_metadata.Add(operatorName);
53+
54+
var dockerImage = Assembly.GetEntryAssembly()?.GetCustomAttribute<DockerImageAttribute>()
55+
?? new DockerImageAttribute("ghcr.io", "operator", "operator", "latest");
56+
57+
_metadata.Add(dockerImage);
5958
}
6059

6160
public IConfiguration Configuration => _configurationManager;

src/K8sOperator.NET/Commands/Install.cs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System;
1010
using System.Reflection;
1111
using System.Runtime.CompilerServices;
12+
using System.Xml.Linq;
1213

1314
namespace K8sOperator.NET.Commands;
1415

@@ -29,8 +30,10 @@ public async Task RunAsync()
2930
{
3031
var watchers = dataSource.GetWatchers(serviceProvider);
3132
var clusterrole = CreateClusterRole(dataSource.Metadata, watchers);
33+
var clusterrolebinding = CreateClusterRoleBinding(dataSource.Metadata);
3234
var deployment = CreateDeployment(dataSource.Metadata);
3335

36+
3437
foreach (var item in watchers)
3538
{
3639
var crd = CreateCustomResourceDefinition(item);
@@ -41,6 +44,8 @@ public async Task RunAsync()
4144

4245
Console.WriteLine(KubernetesYaml.Serialize(clusterrole));
4346
Console.WriteLine("---");
47+
Console.WriteLine(KubernetesYaml.Serialize(clusterrolebinding));
48+
Console.WriteLine("---");
4449
Console.WriteLine(KubernetesYaml.Serialize(deployment));
4550

4651
await Task.CompletedTask;
@@ -51,7 +56,7 @@ private V1CustomResourceDefinition CreateCustomResourceDefinition(IEventWatcher
5156
var group = item.Metadata.OfType<KubernetesEntityAttribute>().First();
5257

5358
var crdBuilder = new CustomResourceDefinitionBuilder();
54-
crdBuilder.WithName("testitems.sonarcloud.io")
59+
crdBuilder.WithName($"{group.PluralName}.{group.Group}")
5560
.WithSpec()
5661
.WithGroup(group.Group)
5762
.WithNames(
@@ -63,15 +68,19 @@ private V1CustomResourceDefinition CreateCustomResourceDefinition(IEventWatcher
6368
.WithScope(Scope.Namespaced)
6469
.WithVersion(
6570
group.ApiVersion,
66-
schema=> schema.WithSchemaForType(item.Controller.ResourceType));
71+
schema=> {
72+
schema.WithSchemaForType(item.Controller.ResourceType);
73+
schema.WithServed(true);
74+
schema.WithStorage(true);
75+
});
6776

6877
return crdBuilder.Build();
6978
}
7079

7180
private static V1Deployment CreateDeployment(IReadOnlyList<object> metadata)
7281
{
73-
var name = metadata.TryGetValue<OperatorNameMetadata, string>(x => x.Name)!;
74-
var image = metadata.TryGetValue<ImageMetadata, string>(x => x.GetImage())!;
82+
var name = metadata.TryGetValue<IOperatorNameMetadata, string>(x => x.Name)!;
83+
var image = metadata.TryGetValue<DockerImageAttribute, string>(x => x.GetImage())!;
7584

7685
var deployment = new DeploymentBuilder();
7786

@@ -85,10 +94,26 @@ private static V1Deployment CreateDeployment(IReadOnlyList<object> metadata)
8594
})
8695
.WithTemplate()
8796
.WithLabel("operator-deployment", name)
97+
8898
.WithPod()
99+
.WithSecurityContext(b =>
100+
b.Add(x => {
101+
x.RunAsNonRoot = true;
102+
x.SeccompProfile = new()
103+
{
104+
Type = "RuntimeDefault"
105+
};
106+
}))
89107
.WithTerminationGracePeriodSeconds(10)
90108
.AddContainer()
91109
.AddEnvFromObjectField("test", x => x.FieldPath = "metadata.namespace")
110+
.WithSecurityContext(x => {
111+
x.AllowPrivilegeEscalation(false);
112+
x.RunAsRoot();
113+
x.RunAsUser(2024);
114+
x.RunAsGroup(2024);
115+
x.WithCapabilities(x => x.WithDrop("ALL"));
116+
})
92117
.WithName(name)
93118
.WithImage(image)
94119
.WithResources(
@@ -105,9 +130,21 @@ private static V1Deployment CreateDeployment(IReadOnlyList<object> metadata)
105130
return deployment.Build();
106131
}
107132

133+
private V1ClusterRoleBinding CreateClusterRoleBinding(IReadOnlyList<object> metadata)
134+
{
135+
var name = metadata.TryGetValue<IOperatorNameMetadata, string>(x => x.Name);
136+
137+
var clusterrolebinding = new ClusterRoleBindingBuilder()
138+
.WithName($"{name}-role-binding")
139+
.WithRoleRef("rbac.authorization.k8s.io", "ClusterRole", $"{name}-role")
140+
.WithSubject(kind: "ServiceAccount", name: "default", ns: "system");
141+
142+
return clusterrolebinding.Build();
143+
}
144+
108145
private static V1ClusterRole CreateClusterRole(IReadOnlyList<object> metadata, IEnumerable<IEventWatcher> watchers)
109146
{
110-
var name = metadata.TryGetValue<OperatorNameMetadata, string>(x => x.Name);
147+
var name = metadata.TryGetValue<IOperatorNameMetadata, string>(x => x.Name);
111148

112149
var clusterrole = new ClusterRoleBuilder()
113150
.WithName($"{name}-role");

src/K8sOperator.NET/Extensions/OperatorHostBuilderExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public static IOperatorApplicationBuilder WithName(this IOperatorApplicationBuil
1313
string name
1414
)
1515
{
16-
builder.Metadata.RemoveAll(x => x.GetType() == typeof(OperatorNameMetadata));
17-
builder.Metadata.Add(new OperatorNameMetadata(name.ToLowerInvariant()));
16+
builder.Metadata.RemoveAll(x => x.GetType() == typeof(OperatorNameAttribute));
17+
builder.Metadata.Add(new OperatorNameAttribute(name.ToLowerInvariant()));
1818
return builder;
1919
}
2020

@@ -25,8 +25,8 @@ public static IOperatorApplicationBuilder WithImage(this IOperatorApplicationBui
2525
string tag = ""
2626
)
2727
{
28-
builder.Metadata.RemoveAll(x => x.GetType() == typeof(ImageMetadata));
29-
builder.Metadata.Add(new ImageMetadata(registery, repository, name, tag));
28+
builder.Metadata.RemoveAll(x => x.GetType() == typeof(DockerImageAttribute));
29+
builder.Metadata.Add(new DockerImageAttribute(registery, repository, name, tag));
3030
return builder;
3131
}
3232

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1-
using k8s.Models;
1+
using k8s;
2+
using k8s.Models;
23

34
namespace K8sOperator.NET.Generator.Builders;
45

5-
internal class ClusterRoleBindingBuilder : KubernetesObjectBuilderWithMetaData<V1ClusterRoleBinding> { }
6+
internal class ClusterRoleBindingBuilder : KubernetesObjectBuilderWithMetaData<V1ClusterRoleBinding>
7+
{
8+
public override V1ClusterRoleBinding Build()
9+
{
10+
var role = base.Build();
11+
role.Initialize();
12+
return role;
13+
}
14+
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
using k8s.Models;
1+
using k8s;
2+
using k8s.Models;
23

34
namespace K8sOperator.NET.Generator.Builders;
45

5-
public class ClusterRoleBuilder : KubernetesObjectBuilderWithMetaData<V1ClusterRole> { }
6+
public class ClusterRoleBuilder : KubernetesObjectBuilderWithMetaData<V1ClusterRole> {
7+
public override V1ClusterRole Build()
8+
{
9+
var role = base.Build();
10+
role.Initialize();
11+
return role;
12+
}
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using k8s.Models;
2+
3+
namespace K8sOperator.NET.Generator.Builders;
4+
5+
internal class ContainerBuilder : KubernetesObjectBuilder<V1Container>
6+
{
7+
8+
}

0 commit comments

Comments
 (0)