示例#1
0
        private void Load(ExtensionInstance extension, string[] assemblies)
        {
            foreach (var path in assemblies)
            {
                try
                {
                    var fileInfo = extension.FileProvider.GetFileInfo(path);

                    if (!fileInfo.Exists)
                    {
                        _logger.LogError(" Could not find extension service provider assembly {Path} in extension {Name}", path, extension.Name);
                        continue;
                    }

                    using var assemblyStream = GetSeekableStream(fileInfo);

                    LoadFromStream(assemblyStream);
                }
                catch (FileLoadException)
                {
                }
                catch (BadImageFormatException)
                {
                }
            }
        }
        public void CanCreateUpdateDeleteExtensionInstanceWithIdentity()
        {
            ClusterInfo cluster = new ClusterInfo(
                name: "nanthicluster0923",
                type: ClusterInfo.ClusterType.connectedClusters,
                location: "eastus2euap",
                resourceGroup: "nanthirg0923"
                );

            ExtensionInstance extensionInstance = new ExtensionInstance(
                name: "microsoft.azuredefender.kubernetes",
                type: ExtensionTestBase.ConfigurationType,
                location: "eastus2euap",
                extensionType: "microsoft.azuredefender.kubernetes",
                autoUpgradeMinorVersion: false,
                releaseTrain: "Stable",
                version: "0.4.61",
                scope: new Scope(
                    cluster: new ScopeCluster(
                        releaseNamespace: "azuredefender"
                        )
                    ),
                identity: new ConfigurationIdentity(
                    type: ResourceIdentityType.SystemAssigned
                    )
                );

            using (var context = MockContext.Start(this.GetType()))
            {
                using (var testFixture = new ExtensionTestBase(context))
                {
                    testFixture.Cluster           = cluster;
                    testFixture.ExtensionInstance = extensionInstance;

                    // List configurations and get count
                    var extensions     = testFixture.ListExtensionInstances();
                    int extensionCount = extensions.Count();

                    // Create a configuration
                    var newExtension = testFixture.CreateExtensionInstance();
                    Assert.NotNull(newExtension);

                    // Get the configuration and verify
                    var ext = testFixture.GetExtensionInstance();
                    Assert.Equal(extensionInstance.Name, ext.Name);
                    Assert.True((ext.InstallState.ToString() == "Pending") || (ext.InstallState.ToString() == "Installed"));

                    // List configurations and get count to confirm it is up by one
                    extensions = testFixture.ListExtensionInstances();
                    Assert.True(extensions.Count() == extensionCount + 1);

                    // Delete the configuration created
                    testFixture.DeleteExtensionInstance();

                    // List configurations and get count to confirm it is what we started with
                    extensions = testFixture.ListExtensionInstances();
                    Assert.True(extensions.Count() == extensionCount);
                }
            }
        }
            public override Expression VisitInvocationExpression(IInvocationExpression invocationExpressionParam, IMetadataResolver context)
            {
                var result = invocationExpressionParam.InvocationExpressionReference.Resolve().Result;
                ExtensionInstance <IDeclaredElement> extension = result.ElementAsExtension();



                return(invocationExpressionParam.InvokedExpression.Accept(this, context));
            }
示例#4
0
        public ExtensionAssemblyLoadContext(string instanceKey, ExtensionInstance extension, string[] assemblies, ILogger logger)
            : base(string.Concat(ALC_Prefix, extension.Name, instanceKey), isCollectible: true)
        {
            if (assemblies is null)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }

            _extension = extension ?? throw new ArgumentNullException(nameof(extension));
            _logger    = logger ?? throw new ArgumentNullException(nameof(logger));

            Unloading += _ => _logger.LogDebug("{Name} extension is unloading", Name);

            Load(extension, assemblies);
        }
示例#5
0
        public override Expression Build()
        {
            IResolveResult resolve = expression.Reference.Resolve().Result;
            ExtensionInstance <IDeclaredElement> element = resolve.ElementAsExtension();

            var property = element.Element as IProperty;

            if (property != null)
            {
                if (property.XMLDocId == "P:System.Array.Length")
                {
                    return(Expression.ArrayLength(context));
                }
            }

            MemberInfo memberInfo = GetReferencedMember(element.Element.ShortName, context.Type);

            return(Expression.MakeMemberAccess(context, memberInfo));
        }
        public IModule GetTargetModule <T>(T element)
        {
            var invocationExpression = element as IInvocationExpression;

            if (invocationExpression != null)
            {
                ExtensionInstance <IMethod> method = InvocationExpressionUtil.GetInvokedMethod(invocationExpression);
                if (method == null)
                {
                    return(null);
                }

                // todo horrible horrible hack, find non shitastick way of doing this
                if (method.Element.XMLDocId == "M:System.Reflection.Assembly.GetExecutingAssembly")
                {
                    return(invocationExpression.GetPsiModule().ContainingProjectModule);
                }
            }
            return(null);
        }
示例#7
0
        public void GivenCustomExtensionShouldBeRegisteredAfterDefaultExtension()
        {
            var defaultPath = "default";
            var customPath  = "custom";
            var options     = new ExtensionOptions();

            options.DefaultExtensions.Add(defaultPath);
            options.ExtensionPaths.Add(customPath);
            var loader = new Mock <IExtensionLoader>();

            using (var defaultInstance = new ExtensionInstance(defaultPath, Mock.Of <IFileProvider>(), defaultPath, MockConfiguration(), NullLogger <ExtensionInstance> .Instance))
            {
                using (var customInstance = new ExtensionInstance(customPath, Mock.Of <IFileProvider>(), customPath, MockConfiguration(), NullLogger <ExtensionInstance> .Instance))
                {
                    loader.Setup(l => l.LoadExtension(It.Is <string>(s => s.EndsWith(defaultPath)))).Returns(defaultInstance);
                    loader.Setup(l => l.LoadExtension(It.Is <string>(s => s.EndsWith(customPath)))).Returns(customInstance);
                    using (var subject = new ExtensionProvider(new[] { loader.Object }, MockConfigurationLoader(), new ExtensionInstanceFactory(NullLogger <ExtensionInstance> .Instance), Mock.Of <IExtensionLocator>(), Options.Create(options), NullLogger <ExtensionProvider> .Instance))
                    {
                        Assert.Equal((subject as IExtensionProvider).Instances.First().Location, defaultPath);
                    }
                }
            }
        }
示例#8
0
 /// <summary>
 /// Create a new Kubernetes Cluster Extension Instance.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='clusterRp'>
 /// The Kubernetes cluster RP - either Microsoft.ContainerService (for AKS
 /// clusters) or Microsoft.Kubernetes (for OnPrem K8S clusters). Possible
 /// values include: 'Microsoft.ContainerService', 'Microsoft.Kubernetes'
 /// </param>
 /// <param name='clusterResourceName'>
 /// The Kubernetes cluster resource name - either managedClusters (for AKS
 /// clusters) or connectedClusters (for OnPrem K8S clusters). Possible values
 /// include: 'managedClusters', 'connectedClusters'
 /// </param>
 /// <param name='clusterName'>
 /// The name of the kubernetes cluster.
 /// </param>
 /// <param name='extensionInstanceName'>
 /// Name of an instance of the Extension.
 /// </param>
 /// <param name='extensionInstance'>
 /// Properties necessary to Create an Extension Instance.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <ExtensionInstance> CreateAsync(this IExtensionsOperations operations, string resourceGroupName, string clusterRp, string clusterResourceName, string clusterName, string extensionInstanceName, ExtensionInstance extensionInstance, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.CreateWithHttpMessagesAsync(resourceGroupName, clusterRp, clusterResourceName, clusterName, extensionInstanceName, extensionInstance, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
示例#9
0
 /// <summary>
 /// Create a new Kubernetes Cluster Extension Instance.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='clusterRp'>
 /// The Kubernetes cluster RP - either Microsoft.ContainerService (for AKS
 /// clusters) or Microsoft.Kubernetes (for OnPrem K8S clusters). Possible
 /// values include: 'Microsoft.ContainerService', 'Microsoft.Kubernetes'
 /// </param>
 /// <param name='clusterResourceName'>
 /// The Kubernetes cluster resource name - either managedClusters (for AKS
 /// clusters) or connectedClusters (for OnPrem K8S clusters). Possible values
 /// include: 'managedClusters', 'connectedClusters'
 /// </param>
 /// <param name='clusterName'>
 /// The name of the kubernetes cluster.
 /// </param>
 /// <param name='extensionInstanceName'>
 /// Name of an instance of the Extension.
 /// </param>
 /// <param name='extensionInstance'>
 /// Properties necessary to Create an Extension Instance.
 /// </param>
 public static ExtensionInstance Create(this IExtensionsOperations operations, string resourceGroupName, string clusterRp, string clusterResourceName, string clusterName, string extensionInstanceName, ExtensionInstance extensionInstance)
 {
     return(operations.CreateAsync(resourceGroupName, clusterRp, clusterResourceName, clusterName, extensionInstanceName, extensionInstance).GetAwaiter().GetResult());
 }