Matrix Transforms, Displacements, and Resultant Forces

Hello All,
I don't have an issue with scikit-fem so much as I have a general question of use.
I'd like to take a beam, constrain one end then displace the other end, but not just in translation-- I'd like to perform a 4x4 matrix transform on that end consisting of both rotation and translation then determine the resultant force.
Every package I've investigated so far only implements the translation without the rotation: Solidworks, Fusion 360, CalculiX, etc.
Is this something that scikit-fem can do? Would you be so kind as to show me how?
Thanks!

So the points x on some face will be transformed to x' = A x + b for matrix A and vector b independent of x, as in https://en.wikipedia.org/wiki/Affine_transformation#Augmented_matrix ?  Then the displacement is u (x) = x' − x = (A − I) x + b.
I think we can do this with a combination of

the linear elasticity example, ex11, except that that has trivially A = I,

https://github.com/kinnala/scikit-fem/blob/de2f4acba96abd6acb716197330e24b7190618b4/docs/examples/ex11.py#L13-L19
and

a way to have the essential boundary conditions depend on the coordinates, as in the parabolic velocity profile applied at the inlet to the backward facing step example, ex24:

https://github.com/kinnala/scikit-fem/blob/de2f4acba96abd6acb716197330e24b7190618b4/docs/examples/ex24.py#L76-L81

I had a go at this.  There was a bit more mucking about with numpy.einsum than I'd like, but I may have overlooked an easier way.  It's basically ex11 but with a nonzero rotation matrix A about the z-axis.
ex_affine.zip

In the course of this I did notice some simplifications in selecting the degrees of freedom for the essential boundary condition in ex24 (& ex27) which I'll push shortly (branch essential-dofs).

For the resultant force, one can integrate the stress over the 'left' boundary, but there might be a short-cut like (K @ u).reshape((3, -1))?  The two methods are demonstrated for the scalar Laplace equation in ex13?

Wow, the transform seems to be working correctly! I've never been exposed to numpy.einsum previously. I'm still not quite sure what's going on there. That will take some more digging. But that's great!
On the other hand, I'm still completely stuck on the resultant force. I've had a go at this quite literally all day and I can't seem to figure it out. I've tried many different combinations, but nothing seems to be correct. I was referencing values in CalucliX, Solid Works, and just a plain old free body diagram to see if the results were even in the ball park. Nothing seems to match.
RESULTS********
Attempt #1:					         3.60e+04, -4.09e+03, -9.30e+00
Attempt #2:						-3.02e+04, 7.23e+03, 2.29e+04
SOFTWARE:
CalculiX:							 3.41e-15, -8.19e-04, 2.90e-15
SolidWorks (Entire Model):			 3.40e-07, -1.94e-06, 1.75e-10
SolidWorks (Left Face):				 3.40e-07,  1.27e-03, 1.75e-10
SolidWorks Result (Entire Model):	         1.97e-06
SolidWorks Result (Left Face):		 1.27e-03
FREE BODY
SkyCiv: (Beam Calculator)			 -8.00e-04 N
Here is a link to the script. The two models that are shown are ex11.py and one with just rotation applied so I could observe the difference.
https://pastebin.com/dYqkvdhj

Sorry, but it's unclear to me what is meant by "resultant force". Integral
of traction over the displaced face?

I don't have the mathematics knowledge to answer your question in like terms. But here's the idea in layman's terms:
If you have a beam of a certain dimension, of a certain material, prevent one end from moving, and displace the other end some amount in 3D space (rotation and/or translation) what is the force that is generated from that displacement?
I guess it's like FEM in reverse? Rather than input the force and see the displacement, I'd like to input the displacement, and determine the force.
Does that make any sense?

Alright, I think I get your point. So you would like to know the force (field) which must be applied to the object's other end so that the object will be deformed from the reference configuration into the configuration specified by the rotation and translation matrix?

Yes! That's it. Does it matter which end? Wouldn't the magnitudes be the same, with the force vectors inverted?
I think it's a two part problem where first we find the deformation field after applying the transform to the free end, and then calculate the forces based on the deformations and integrate for one end. But I'm honestly talking above my pay grade here.
Here's an example I found: https://primeraeng.com/wp-content/uploads/2016/03/An-Introduction-to-the-Finite-Element-Method-for-Young-Engineers_PART-2.pdf
Page 25 and 27-- It is only looking at the force (and moment) in one dimension to simplify things.

I really appreciate you guys taking the time to help me out... especially considering my lack of general knowledge of the inner workings of FEM.

This should work in master branch:
from skfem.models.elasticity import linear_stress

sigma = linear_stress(1e3, 0.3)
force = [0] * 3

left_facets = m.facets_satisfying(lambda x: x[0] == 0.0)
left_basis = FacetBasis(m, e, facets=left_facets)

for i in range(3):

    @Functional
    def traction(w):
        from skfem.helpers import sym_grad, dot
        return dot(sigma(sym_grad(w['w']))[i], w.n)

    force[i] = traction.assemble(left_basis, left_basis.interpolate(u))

For me it gives (combined with the example of @gdmcbain)
In [1]: force
Out[1]: [81.36988270476198, -0.05297977805562402, -3.686287386450715e-18]

Does it make sense?
Note: I'm currently working on a new release 1.0.0 and have almost forgotten how the things look in 0.4.2. If you want to use 0.4.2 you need to do some modifications to how the functional traction is defined.

Had another go at this today. I think I've made some progress.
https://www.dropbox.com/s/uf5rie6938xbnhk/ex_affine_result_force.py?dl=0

I had to adjust the affine function to work with 4x4 Matrices to get the behavior I was looking for:

We need something to compare the result to. Firstly I used FreeCad/Calculix to translate the right side by 1mm in the y-axis. The resulting displacement mesh has the right and left sides non-orthogonal. Using only translation with a matrix transform will keep the right side parallel to the left. It seems the same thing happens in ex11.py if you modify line 19: 'u[dofs['right'].nodal['u^2']] = 0.3' https://github.com/kinnala/scikit-fem/blob/de2f4acba96abd6acb716197330e24b7190618b4/docs/examples/ex11.py#L13-L19

However this behavior is different in FreeCad/CalculiX. So I iteratively adjusted the transformation matrix to get very similar looking displaced mesh to FreeCad/CalculiX.
 Secondly, I calculated by hand what the result should be on the y-axis just to get a ball park figure. Here are the results:

It looks like CalculiX and Hand Calculations are in agreement but scikit-fem is off. I'm wondering if rather than integrating over the resultant forces, we're integrating over internal stresses of the material?
https://www.dropbox.com/s/uf5rie6938xbnhk/ex_affine_result_force.py?dl=0

I tried to refine the mesh in your example twice and got something which is closer to the other results at least in y-axis.
**********************RESULTS***********************
scikit-fem:			 -1.53e+04, -8.67e-04, -6.60e-06
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

Not sure if this is what you're after. Remark: I don't completely understand why CalculiX would have x and z components equal to zero based on my intuition. Maybe we are after all calculating a different quantity?
Note: I also tried to use ElementTriP2 to get a more accurate result but realized that one of the remaining issues #83 causes the approach of using get_dofs to not work for higher-order tetrahedral elements.

Okay, I managed to fix #83 .
With twice refined tetrahedral mesh and quadratic elements I get
**********************RESULTS***********************
scikit-fem:			 -1.28e+04, -2.90e-04, -4.31e-06
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

The order of magnitude seems to be still correct. This is most likely more accurate than the linear solution above.
In my opinion it makes sense that

z-component is almost zero since no twisting happens in that direction
x-component is nonzero since there will always be some pull or push if the beam is displaced in this way, and
y-component has the same order of magnitude than your hand calculation

I'm wondering if rather than integrating over the resultant forces, we're integrating over internal stresses of the material?

Stress tensor (= "internal stress") multiplied by a unit vector gives a force (field) called "traction". Traction on the boundary of the domain is something that can be specified as a boundary condition and is equivalent to an external force (field). Here we do not specify the traction as a boundary condition but simply integrate the resulting traction over the left boundary:
@Functional
def traction(w):
    from skfem.helpers import sym_grad, dot
    return dot(sigma(sym_grad(w['w']))[i], w.n)

force[i] = traction.assemble(left_basis, left_basis.interpolate(u))

Here sigma(...) is the stress tensor and w.n is the normal unit vector. The last line integrates over the left boundary. So we are only considering boundary stresses and not internal stresses.

I appreciate you explaining all of this to me. I'm used to just hitting the big gray button that looks like this: [SOLVE]. So I'm learning a lot and really appreciate your patience. :D
Would you mind popping over here and seeing how they determine their reactions forces? https://fenicsproject.discourse.group/t/computation-of-reaction-force/129
Are we doing it the same way?

That seems to be a slightly different approach, let me try it out.

Thanks for the link to the 'Computation of reaction force'.  That looks like a domain integral rather than a boundary integral.  I think this is like what I was alluding to on Friday.  Often one can swap between domain integrals and boundary integrals using some version of 'integrating by parts' or the divergence theorem (a.k.a. Gauss's or Ostrogradsky's, Green's, or Stokes's theorem, ...).  I'm very familiar with this in heat transfer and incompressible fluid flow, but a little less sure exactly how it goes in elasticity and I don't have my library here at the moment.
I think in elasticity the equivalence can be discussed in terms of energy and work.  The increase in the elastic energy stored in the elastic domain equals the work done by the external forces.  The external forces here are the traction applied at the 'right' to produce the imposed displacement and the traction applied at the 'left' to keep the displacement there zero.  The work done by a traction is the integral of the scalar product of the traction vector with the displacement vector.  (The traction is in turn the scalar product of the stress tensor with the normal vector of the surface on which it acts.)
The elastic energy is something like the integral over the domain of the scalar product (double contraction) of the stress and strain tensors; I think that that's what's meant by the FEniCS expression
assemble(inner(sigma(u,p),epsilon(v))*dx)

A good way to derive these relations begins with the weak formulation of the problem, replacing the test function with the solution.  But this may be going into more detail that the OP is interested in at the moment.  This is what is used for the 'Laplace with mixed boundary conditions' ex13 where the conductance is computed from the domain integral of Joule heating
u @ A @ u

and the current from a boundary integral of flux
for port, boundary in mesh.boundaries.items():
    fbasis = FacetBasis(mesh, elements, facets=boundary)
    current[port] = asm(port_flux, fbasis, w=fbasis.interpolate(u))

and they give numerically the same answer (or equal & opposite for the currents at the two ends):
conductance: {'skfem': 0.4416548065660517, 'exact': 0.4412712003053032}
Current in through ports: {'ground': -0.44160370313261493, 'positive': 0.4416152264597093}

The same kind of thinking applies to continuum mechanics, it's just more involved because this involves vectors and tensors instead of scalars and vectors.
Although mathematically equivalent for the continuous problem, for the discrete problem, the domain approach is often more accurate and easier to implement, as argued in 'Three ways to compute multiport inertance'.

Another difference following from the higher tensorial order of elastic deformation versus potential flow is that the 'Resultant force' also includes a torque.

A resultant force is the single force and associated torque obtained by combining a system of forces and torques acting on a rigid body.

In lumped models, this is the difference between 'pinned' and 'clamped' joints.
I don't know whether the torque is of interest here, but if this example evolves into one for the documentation, it might be a good idea to calculate the resultant torque too.
Actually there are a couple of concepts overlapping here: 'resultant' and 'reaction'.  The system of tractions appears at the 'left' in reaction to the action of the displacements imposed at 'right'.  This system can then be integrated to give the 'resultant' force (& torque).

 I accidentally...

...initialized sigma with wrong material parameters
...used the deformed mesh when postprocessing
Now I'm at least getting consistent results with the two approaches that I'm using:

**********************RESULTS***********************
scikit-fem 2:			 -2.72e+04, -1.15e+03, 2.87e+00
scikit-fem:			 -3.40e+04, -3.25e+03, -2.56e+01
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

Here scikit-fem 2 is the domain integral approach and scikit-fem is the boundary integral approach from before.
Now the question remains that how can we compare to the results of @mbatesole . Now I think since you seem to use mm as a unit of length (based on the comments of the code), you should use MPa as a unit of Young's modulus. This gives much better correspondence:
**********************RESULTS***********************
scikit-fem 2:			 -2.72e-02, -1.15e-03, 2.87e-06
scikit-fem:			 -3.40e-02, -3.25e-03, -2.56e-05
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

This is still with linear elements. To get closer to numerical convergence, I'm refining the mesh and using second order tetrahedrons.
**********************RESULTS***********************
scikit-fem 2:			 -2.73e-02, -1.01e-03, -3.42e-08
scikit-fem:			 -2.86e-02, -1.21e-03, -1.68e-05
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

Theoretically speaking approach 2 is more accurate (as @gdmcbain mentioned above), so I think this is as close as I can get now with a laptop and this numerical approach. Here is the code:
import pygmsh
import numpy as np
from skfem import *
from skfem.models.elasticity import linear_elasticity, lame_parameters
from skfem.io.meshio import from_meshio
import transformations as tf

BEAM_WIDTH = .635
BEAM_HEIGHT = 0.4318 # .017in=0.4318mm;  .019in=0.4826mm
BEAM_LENGTH = 4

def create_beam():
    geom = pygmsh.opencascade.Geometry(characteristic_length_min=.3, characteristic_length_max=.3 )
    rectangle = geom.add_rectangle([0, 0, 0], BEAM_LENGTH, BEAM_HEIGHT)
    geom.extrude(rectangle, [0, 0, BEAM_WIDTH])

    mesh = pygmsh.generate_mesh(geom)
    return mesh

def affine(x, y, z):
    result =  np.einsum('ijk->kij', np.einsum('ij,j...', a - np.eye(a.shape[0]), np.stack([x, y, z, np.ones(x.shape)])) + b)
    return result[:3,:]

mesh = create_beam()
m = from_meshio(mesh)
m.refine(2)

# offset mesh to get origin in the middle of the left side
m.p[1] -= BEAM_HEIGHT/2.0
m.p[2] -= BEAM_WIDTH/2.0

# Stiffness Matrix
e1 = ElementTetP2()
e = ElementVectorH1(e1)
ib = InteriorBasis(m, e)
K = asm(linear_elasticity(*lame_parameters(4, 0.4)), ib)

dofs = {
    'left': ib.get_dofs(lambda x: x[0] == 0.0),
    'right': ib.get_dofs(lambda x: x[0] == BEAM_LENGTH),}

u = np.zeros(K.shape[0])
right_facets = m.facets_satisfying(lambda x: x[0] == BEAM_LENGTH)
right_basis = FacetBasis(m, e, facets=right_facets)
right_dofs = right_basis.get_dofs(right_facets).all()

# Transformation Matrix
# Here I've iteratively adjusted the transformation until the mesh displacement matches very
# closely the output of CalucliX for a displacement on the y-axis of 1.0 mm
a = tf.rotation_matrix(np.radians(20), [0, 0, 1], [BEAM_LENGTH, 0, 0])
b = [.1, 1, 0, 1]

# Solve the FEA for displacement
u[right_dofs] = L2_projection(affine, right_basis, right_dofs)

I = ib.complement_dofs(dofs)
u = solve(*condense(K, 0 * u, I=I, x=u))

# Determine the resultant forces. Approach 1.
from skfem.models.elasticity import linear_stress

sigma = linear_stress(*lame_parameters(4, 0.4))
force1 = [0] * 3

left_facets = m.facets_satisfying(lambda x: x[0] == 0.0)
left_basis = FacetBasis(m, e, facets=left_facets)

for i in range(3):

    @Functional
    def traction(w):
        from skfem.helpers import sym_grad, dot
        return dot(sigma(sym_grad(w['w']))[i], w.n)

    force1[i] = traction.assemble(left_basis, left_basis.interpolate(u))

# Determine the resultant forces. Approach 2.
y = K @ u
force2 = [0] * 3

for i in range(3):
    ido = np.zeros(u.shape[0])
    dimdofs = ib.nodal_dofs[i] if len(ib.edge_dofs) == 0 else\
        np.union1d(ib.nodal_dofs[i], ib.edge_dofs[i])
    ido[dimdofs] = 1
    ido[dofs['right'].all()] = 0
    force2[i] = ido @ y

if __name__ == "__main__":
    print()
    print("**********************RESULTS***********************")
    print("scikit-fem 2:\t\t\t {:.2e}, {:.2e}, {:.2e}".format(force2[0], force2[1], force2[2]))
    print("scikit-fem:\t\t\t {:.2e}, {:.2e}, {:.2e}".format(force1[0], force1[1], force1[2]))
    print("CalculiX:\t\t\t  {:.2e}, {:.2e},  {:.2e}".format(3.408515e-15, -8.185536e-04, 2.900187e-15))
    print("By Hand (y-axis)\t\t\t    {:.2e}".format( -.0008))

    from os.path import splitext
    from sys import argv

    m.save(splitext(argv[0])[0] + '.vtk')

In practice I'd probably use hexahedral elements or at least a tensor product mesh because of the apparent symmetries in the problem.

Wow thank you guys so much!
@gdmcbain: Your explanations taught me a lot! Personally, I'd love to see the resultant force broken down into forces and torques.
@kinnala: Here's one thing that's super interesting to me... going back to https://github.com/kinnala/scikit-fem/issues/357#issuecomment-608976910 I listed the values I got running the simulation through SolidWorks.

SolidWorks (Left Face): 3.40e-07, 1.27e-03, `1.75e-10

As you can see the value for the y-axis is pretty much spot on with your latest results. So now I'm wondering what is going on with the Hand and CalculiX measurements?!
Running the example with second order tetrahedrons causes this error on my machine:
/usr/local/lib/python3.6/dist-packages/scikits/umfpack/umfpack.py:563: UmfpackWarning: Singular matrix
  warnings.warn('Singular matrix', UmfpackWarning)
/usr/local/lib/python3.6/dist-packages/scikits/umfpack/umfpack.py:712: UmfpackWarning: Zeroing nan and inf entries...
  warnings.warn('Zeroing nan and inf entries...', UmfpackWarning)
/usr/local/lib/python3.6/dist-packages/scikits/umfpack/umfpack.py:717: RuntimeWarning: divide by zero encountered in double_scalars
  econd = 1.0 / self.info[UMFPACK_RCOND]
/usr/local/lib/python3.6/dist-packages/scikits/umfpack/umfpack.py:721: UmfpackWarning: (almost) singular matrix! (estimated cond. number: inf)
  warnings.warn(msg, UmfpackWarning)

Looks like the error happens during the call to L2_projection.
For fun I attempted to run the example with a hexahedral mesh as you suggested in https://github.com/kinnala/scikit-fem/issues/357#issuecomment-609729303
**********************RESULTS***********************
scikit-fem 2:			 -2.70e-02, -1.24e-03, -1.83e-15
scikit-fem:			 -4.26e-02, -1.01e-02, -2.09e-15
CalculiX:			  3.41e-15, -8.19e-04,  2.90e-15
By Hand (y-axis)			    -8.00e-04

It agrees with the previous data.

I'm curios to know why the blue on the right end doesn't extend to the edges of the face in the y-dimension. Is that what you'd expect, or did I set something up incorrectly?
For sake of completeness, here's the same setup but with the linear tetrahedral mesh.

And, here's my code to generate the hexahedral mesh:
def create_hex_beam():
    geom = pygmsh.built_in.Geometry()
    geom.add_raw_code('Mesh.RecombineAll = 1;')
    geom.add_raw_code('Mesh.Recombine3DAll = 1;')

    #Algorithm: 1:MeshAdapt, 2:Automatic, 3:Delaunay, 6:Frontal-Delaunay,
    #7:BAMG, 8:Frontal-Delaunay for Quads, 9:Packing of Parallelograms
    #geom.add_raw_code('Mesh.Algorithm = 8;')

    # Subdivision: 0:None, 1:all quadrangles, 2:all hexadedra, 3:barycentric
    geom.add_raw_code('Mesh.SubdivisionAlgorithm = 2;')
    xmin = 0
    xmax = BEAM_LENGTH
    ymin = -BEAM_HEIGHT/2.0
    ymax = BEAM_HEIGHT/2.0

    rectangle = geom.add_rectangle(xmin, xmax, ymin, ymax,z=0)
    geom.set_transfinite_lines(rectangle.lines, size=8)#, bump=.2)
    geom.set_transfinite_surface(rectangle.surface)
    geom.extrude(rectangle,[0, 0, BEAM_WIDTH], num_layers=4, recombine=True )

    mesh = pygmsh.generate_mesh(geom)
    m = from_meshio(mesh)
    m.p[2] -= BEAM_WIDTH / 2.0
    e = ElementHex1()
    return(m, e)

The hexahedral mesh should be easy to make with skfem.MeshHex.init_tensor.  (Although it'd be really nice to have ElementHex2 #327 or a 20-node serendipity element.  TODO!)
I was also thinking it should be possible to simply load the Calculix mesh directly into scikit-fem, thanks to meshio.
I did have Calculix installed on my Ubuntu machine in the office and will look into setting it up on this Windows 10 laptop later on.  I find these comparisons between codes extremely helpful in general.

The domain integral approach didn't come out as I had imagined.  (Not that everything every comes out as I had imagined!)  I'll work through this more closely.  My idea is to repeat the analysis of 'Three ways…' for elasticity instead of potential flow.  It will be good to have this written up anyway.

Ah, I see, yes, the domain integral approach isn't so straightforward here unless the displacement imposed over the 'right' is uniform; otherwise it doesn't factor out.  (The analysis might be generalized but...that remains TODO.)
Here's my sketch of a derivation.
In the absence of body forces, equilibrium is
div σ = 0
where σ is the stress tensor.
The weak formulation is that the inner product (integral over domain of double contraction) of this with any test vector field v vanishes.
(v, div σ) = 0, for all v
Integrate by parts, using symmetry of σ,
(v, n . σ)_boundary = (sym grad v, σ)
(Have I dropped a factor of a half on the right-hand side?  There are lots of factors of a half in the theory of elasticity.)
The boundary integral can be split up into the sum of:

over the free boundary where n . div σ = 0, which vanishes

over the parts with prescribed traction n . div σ, but that's nowhere here

over the parts with prescribed displacement, here 'right' and 'left'

over parts with other (e.g. 'Robin') boundary conditions but none of that here
(v, n . σ)_right + (v, n . σ)_left = (sym grad v, σ)

Put v = u, the displacement, noting:

sym grad u = ε, the strain.  (Or is it half or twice the strain?)

u = 0 on 'left'
(u, n . σ)_right = (ε, σ).

Now the difficulty appears: if u were uniform, it could be factored outside the inner product on the left leaving an expression for the resultant force in terms of the elastic strain energy (or half or twice it) on the right, e.g. if u = u0 i
(i, n . σ)_right = (ε, σ) / u0
and the left-hand side is i . F on 'right', but in the OP u varies over the 'right' and more care is required, or maybe it's not worthwhile.
Apologies for carelessness with regard to factors of a half and doubtless idiosyncratic notation.

I think extending the previous to torque would begin with multiplying the partial differential equation by the position vector x relative to the point about which the resultant torque is reckoned.  Is it a cross-product, x × div σ = *0)?

I'm not understanding something simple.  In
# Transformation Matrix
# Here I've iteratively adjusted the transformation until the mesh displacement matches very
# closely the output of CalucliX for a displacement on the y-axis of 1.0 mm
a = tf.rotation_matrix(np.radians(20), [0, 0, 1], [BEAM_LENGTH, 0, 0])
b = [.1, 1, 0, 1]

Why isn't 'a displacement on the y-axis of 1.0 mm' just represented by A = 0 and b = [0, 1, 0]?  (And why does the b above have four components?  Has it been redefined from u = x'- x and x'= Ax + b?)

Hey vtkplotter.Plotter looks great!  Three-dimensional plotting in matplotlib is awful; it distorts the three axes uncontrollably #44.  ParaView, Gmsh, & VisIt work but are too heavy; this kind of thing (from ex_affine_result_force.py)
 from vtkplotter import Plotter

    m.save(splitext(argv[0])[0] + '.vtk')

    vp = Plotter(bg=np.array([.223,.223,.223]),axes=2)
    beam1 = vp.load(splitext(argv[0])[0] + '.vtk')
    beam1.color('steelblue')
    vp.show([beam1])

is exactly what I'd like to be able to do in scikit-fem scripts.

Could you share the CalculiX script?  I think I've installed CalculiX 2.10 O. K. from https://github.com/GeneralElectric/CalculiX but am not all familiar with the input syntax.

vtkplotter really is great! I don't know how much you've played with it, but you can interact with it as well. If you hit the h key when the window is active it'll print() you a list of commands you can use. Even better, the developer has so many examples showing off its capabilities (including user interface elements). I was going to actually open a new issue here and suggest you guys take a look at it. I find it MUCH better than matplotlib. https://github.com/marcomusy/vtkplotter
I'd love it if you were able to use this to publish something!
Here's the CalculiX .inp generated by FreeCad/Fem: https://www.dropbox.com/s/wl85ggzerpzuo8c/FEMMeshGmsh.inp?dl=0

Oh about the matrix transforms. I don't know the mathematical term, but the order of operation is important. (My formal training is in orthodontics by the way so if you want to use big words about teeth, let me know ;) ) Multiplying in one direction give one result, in the other it gives another result.  With a 3x3 matrix the rotation happens from the origin, but if you extend that to 4x4 you can rotate around an arbitrary point in space (the fourth column).
So in this example, I wanted to first rotate the right face around it's center, then translate it in space. Rotating the face around the origin, then translating it gives a completely different spatial result.

I don't know the mathematical term, but the order of operation is important.

This could be ‘associative’ or ‘commutative’.  Transforms A, B, & C are associative if (AB)Cx = A(BC)x for all x; transforms A & B commute if A(Bx) = B(Ax) for all x.  Our transforms are associative, so the order or combining (AB)C or A(BC) isn't important but not commutative so AB≠BA, in general.
The biggest word I know in orthodontics is 'OW!'; feel free to drop more in.
But what I was confused with above, with why b was a 4-vector instead of a 3-vector, was when earlier I had looked up Affine_transformation#Augmented_matrix, I had found that

to perform a 4x4 matrix transform on that end consisting of both rotation and translation

it had the form

where y, x, and b are 3-vectors, A is 3x3.
I think now on looking at it again, @kinnala had just tacked the 1 that's always there in the lower-right hand corner of the 4×4 matrix onto the end of the 3-vector b to make it a 4-vector, so it's just a change of notation.
Going back to

So in this example, I wanted to first rotate the right face around it's center, then translate it in space. Rotating the face around the origin, then translating it gives a completely different spatial result.

The effect of two transformations, x1 = A0 x0 + b0, x2 = A1 x1 + b1 = A1 (A0 x0 + b0) + b1, when the first is a rotation about the origin (b0 = 0) and the second a translation (A1 = I) is x2 = A0 x0 + b1, which is just one 4×4 transformation with 3×3 rotation matrix A0 and translation 3-vector b1.  Translating about the centre would be more involved; we'd need know where the centre was.  So working through the interpretation of rotation about an arbitrary point.

With a 3x3 matrix the rotation happens from the origin, but if you extend that to 4x4 you can rotate around an arbitrary point in space (the fourth column).

If the centre of rotation is c, I think we need to:

Translate centre to origin (A=I, b= −c)
Rotate about origin (A=A, b=0)
Translate back (A=I, b=+c)

That's (N. B.: sequence of transformations is right to left)
[ I | c ] [ A | 0 ] [ I | –c ] = [ A | c – Ac ]
[ 0 | 1 ] [ 0 | 1 ] [ 0 |  1 ]   [ 0 |      1 ]

i.e. a 4×4 transformation with rotation matrix A and translation b = c − Ac.  Is that right?

Thank you for the FEMMeshGmsh.inp.  It doesn't load into meshio:
meshio.read('FEMMeshGmsh.inp')

raises a ValueError.  I might investigate this further over at meshio, but it's not immediately a concern for scikit-fem.  It would have been nice to have been able to load the mesh, but no matter.
The file does run through ccx_2.16 which I have installed on Ubuntu 19.10.
Looking into FEMMeshGmsh.inp in Emacs, I see NSET=ConstraintFixed (line 786) and NSET=ConstraintDisplacement (line 825) which I presume correspond to 'left' and 'right' and then on line 897:
ConstraintDisplacement,2,2,1.0

I think this means that from the second to the second component of displacement is 1.0.  This doesn't look like what has been applied in the pictures above.  I would have thought that this would constrain NSET=ConstraintFixed and NSET=ConstraintDisplacement to remain parallel, just with the latter translated in its plane in the y-direction.
So far I've only run FEMeshGmsh.inf in ccx_2.16 which has produced a bunch of files (.12d, .cvg, .dat, .frd, .sta).  (I haven't worked out how to render these graphically yet.)  FEMMeshGmsh.dat says that the 'total force' for 'set CONSTRAINTFIXED' is
        3.408515E-15 -8.185536E-04  2.900187E-15

so essentially all in the y-direction.

I reported the meshio.read error upstream at nschloe/meshio#749.
On looking more closely into FEMMeshGmsh.inp, I don't think we're going to be able to read it here anyway: TYPE=C3D10 corresponds to meshio type "tetra10"; scikit-fem only reads simplicial meshes like "tetra4".

It should be in principle be possible to read second-order meshes now that we have the option to use curved meshes (in ex31), but I haven't tested it and there is no simple interface for that.

Thanks guys for the nice words :) i'm happy that you found it useful.
vtkplotter has now changed name to vedo but the functionality is the same.
Recent developments (still abit experimental) which might be of interest to you are visualization of tet meshes, including cutting/slicing/thresholding/isosurfacing e.g.

more examples here

@marcomusy Thanks for reaching out. We are looking into a way to make a simple wrapper for transforming meshes and solution fields from scikit-fem to vtkplotter (now vedo) in https://github.com/kinnala/scikit-fem/issues/361. Our goal is to add a simple module to skfem.visuals which figures out the nasty details on how to transform between the data structures of the two libraries. In scikit-fem we have classes MeshTet and MeshHex that describe tetrahedral and hexahedral meshes.
I could quite easily adapt this example to read scikit-fem mesh into vedo: https://github.com/marcomusy/vedo/blob/master/vedo/examples/tetmesh/tet_build.py
Basically we have points and tets as in the above example available as MeshTet.p and MeshTet.t. The solutions are given also as arrays similar to scal.
Do you find this the correct interface to use for this kind of use case or is there something else we should use?

@kinnala I think that's exactly the way to go! As you already have got everything in class MeshTet it should be quite straightforward to connect the two libraries.

@kinnala I think that's exactly the way to go! As you already have got everything in class MeshTet it should be quite straightforward to connect the two libraries.
btw i was also planning to add a vedo.HexMesh class so you might exploit that too in sciki-fem

Thanks for the answer. We continue tracking this in #361 .


redirect plugin commands cp.stdout to terminal && send entered commands to cp.stdin

we need to be able to see output from child processes, esp in the event that one prints text asking for input. subsequently, we need to be able to type responses and have the child process respond.
perhaps doing so can be circumvented with a --quiet option.

should probably be implemented using a reusable module, to be required and used in each plugin

check out https://github.com/dthree/vorpal

https://www.npmjs.com/package/xterm


HDFS-16845: Adds configuration flag to allow clients to use router observer reads without using the ObserverReadProxyProvider.

HDFS-16845: Adds configuration flag to allow clients to use router observer reads without using the ObserverReadProxyProvider.

Description of PR
Description
In order for clients to have routers forward their reads to observers, the clients must use a proxy with an alignment context. This is currently achieved by using the ObserverReadProxyProvider.
Using ObserverReadProxyProvider allows backward compatible for client configurations.
However, the ObserverReadProxyProvider forces an msync on initialization which is not required with routers.
Performing msync calls is more expensive with routers because the router fans out the cal to all namespaces, so we'd like to avoid this when possible since the router will proxy the initial client call without federatedstate to the Active.
How was this patch tested?
New test cases in TestObserverWithRouter.
For code changes:

[ x] Does the title or this PR starts with the corresponding JIRA issue id (e.g. 'HADOOP-17799. Your PR title ...')?

:confetti_ball: +1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 44s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s

No case conflicting files found.

+0 :ok:
codespell
0m  1s

codespell was not available.

+0 :ok:
detsecrets
0m  1s

detect-secrets was not available.

+0 :ok:
xmllint
0m  1s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
15m 56s

Maven dependency ordering for branch

+1 :green_heart:
mvninstall
27m 19s

trunk passed

+1 :green_heart:
compile
6m 31s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
compile
6m  5s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
checkstyle
1m 31s

trunk passed

+1 :green_heart:
mvnsite
3m 59s

trunk passed

+1 :green_heart:
javadoc
3m  1s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 41s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 54s

trunk passed

+1 :green_heart:
shadedclient
21m 50s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 33s

Maven dependency ordering for patch

+1 :green_heart:
mvninstall
2m 51s

the patch passed

+1 :green_heart:
compile
5m 58s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javac
5m 58s

the patch passed

+1 :green_heart:
compile
5m 57s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
javac
5m 57s

the patch passed

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

+1 :green_heart:
checkstyle
1m 15s

the patch passed

+1 :green_heart:
mvnsite
3m 10s

the patch passed

+1 :green_heart:
javadoc
2m 22s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 12s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 54s

the patch passed

+1 :green_heart:
shadedclient
22m 29s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

+1 :green_heart:
unit
2m 41s

hadoop-hdfs-client in the patch passed.

+1 :green_heart:
unit
250m 31s

hadoop-hdfs in the patch passed.

+1 :green_heart:
unit
23m  5s

hadoop-hdfs-rbf in the patch passed.

+1 :green_heart:
asflicense
1m 13s

The patch does not generate ASF License warnings.

434m 38s

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/1/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux 145b5c8046bf 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 668d5d217d8386e936246caabeafa7f50c05b10f

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/1/testReport/

Max. process+thread count
3386 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/1/console

versions
git=2.25.1 maven=3.6.3 spotbugs=4.2.2

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.

@ZanderXu @tomscut could you please take a look whenever you get a chance.

@ZanderXu @tomscut could you please take a look whenever you get a chance.

@simbadzina I did a quick review. The change looks good to me. I am curious about that what scenarios will use this feature without msyc(). Can you share me some cases?

@ZanderXu @tomscut could you please take a look whenever you get a chance.

@simbadzina I did a quick review. The change looks good to me. I am curious about that what scenarios will use this feature without msyc(). Can you share me some cases?

Thanks @ZanderXu . Third party readers issuing multiple reads will use msync if they want consistency, both before and after this path. The msync this flag eliminates is the one at the initialization of the ObserverReadProxyProvider here
https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ObserverReadProxyProvider.java#L341-L348
Taking an example of a client just doing a list status.
If the client is using ObserverReadProxyProvider. They'll be two calls.

msync (during initialization)
getListing (actual call the client wants to do)
When the router gets the msync, it will fan this out to all namespace, which is expensive.

With this patch, they'll only be one call.

getListing
The router will send this call to the active.

For future reads after this, there is no difference.

Mostly mechanical review, with some questions.

:broken_heart: -1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 42s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  1s

No case conflicting files found.

+0 :ok:
codespell
0m  0s

codespell was not available.

+0 :ok:
detsecrets
0m  0s

detect-secrets was not available.

+0 :ok:
xmllint
0m  0s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
15m 40s

Maven dependency ordering for branch

-1 :x:
mvninstall
23m 21s
/branch-mvninstall-root.txt
root in trunk failed.

-1 :x:
compile
1m 45s
/branch-compile-hadoop-hdfs-project-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs-project in trunk failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
compile
0m 52s
/branch-compile-hadoop-hdfs-project-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs-project in trunk failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

+1 :green_heart:
checkstyle
1m 52s

trunk passed

+1 :green_heart:
mvnsite
4m 17s

trunk passed

+1 :green_heart:
javadoc
3m 27s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
4m  8s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

-1 :x:
spotbugs
3m 24s
/branch-spotbugs-hadoop-hdfs-project_hadoop-hdfs-client.txt
hadoop-hdfs-client in trunk failed.

-1 :x:
spotbugs
0m 47s
/branch-spotbugs-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in trunk failed.

-1 :x:
spotbugs
0m 48s
/branch-spotbugs-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in trunk failed.

+1 :green_heart:
shadedclient
20m 37s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 28s

Maven dependency ordering for patch

-1 :x:
mvninstall
0m 32s
/patch-mvninstall-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch failed.

-1 :x:
mvninstall
0m 30s
/patch-mvninstall-hadoop-hdfs-project_hadoop-hdfs-client.txt
hadoop-hdfs-client in the patch failed.

-1 :x:
mvninstall
0m 31s
/patch-mvninstall-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in the patch failed.

-1 :x:
compile
0m 32s
/patch-compile-hadoop-hdfs-project-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs-project in the patch failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
javac
0m 32s
/patch-compile-hadoop-hdfs-project-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs-project in the patch failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
compile
0m 30s
/patch-compile-hadoop-hdfs-project-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs-project in the patch failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

-1 :x:
javac
0m 30s
/patch-compile-hadoop-hdfs-project-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs-project in the patch failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

-0 :warning:
checkstyle
0m 29s
/buildtool-patch-checkstyle-hadoop-hdfs-project.txt
The patch fails to run checkstyle in hadoop-hdfs-project

-1 :x:
mvnsite
0m 31s
/patch-mvnsite-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch failed.

-1 :x:
mvnsite
0m 32s
/patch-mvnsite-hadoop-hdfs-project_hadoop-hdfs-client.txt
hadoop-hdfs-client in the patch failed.

-1 :x:
mvnsite
0m 32s
/patch-mvnsite-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in the patch failed.

-1 :x:
javadoc
0m 32s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs in the patch failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
javadoc
0m 31s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-client-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs-client in the patch failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
javadoc
0m 31s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-rbf-jdkUbuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.txt
hadoop-hdfs-rbf in the patch failed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04.

-1 :x:
javadoc
0m 32s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs in the patch failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

-1 :x:
javadoc
0m 31s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-client-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs-client in the patch failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

-1 :x:
javadoc
0m 30s
/patch-javadoc-hadoop-hdfs-project_hadoop-hdfs-rbf-jdkPrivateBuild-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.txt
hadoop-hdfs-rbf in the patch failed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07.

-1 :x:
spotbugs
0m 31s
/patch-spotbugs-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch failed.

-1 :x:
spotbugs
0m 32s
/patch-spotbugs-hadoop-hdfs-project_hadoop-hdfs-client.txt
hadoop-hdfs-client in the patch failed.

-1 :x:
spotbugs
0m 34s
/patch-spotbugs-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in the patch failed.

+1 :green_heart:
shadedclient
11m 46s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

-1 :x:
unit
0m 31s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch failed.

-1 :x:
unit
0m 31s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs-client.txt
hadoop-hdfs-client in the patch failed.

-1 :x:
unit
0m 31s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in the patch failed.

+0 :ok:
asflicense
0m 31s

ASF License check generated no output?

81m  5s

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/2/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux a9ad688627a4 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 95d23f090ab992566010b221996c84db2882a50a

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/2/testReport/

Max. process+thread count
101 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/2/console

versions
git=2.25.1 maven=3.6.3

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.

:broken_heart: -1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 57s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s

No case conflicting files found.

+0 :ok:
codespell
0m  1s

codespell was not available.

+0 :ok:
detsecrets
0m  1s

detect-secrets was not available.

+0 :ok:
xmllint
0m  1s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
18m 12s

Maven dependency ordering for branch

+1 :green_heart:
mvninstall
27m 32s

trunk passed

+1 :green_heart:
compile
6m 48s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
compile
7m 14s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
checkstyle
1m 52s

trunk passed

+1 :green_heart:
mvnsite
3m 50s

trunk passed

+1 :green_heart:
javadoc
3m 17s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 58s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
8m 23s

trunk passed

+1 :green_heart:
shadedclient
21m 29s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 29s

Maven dependency ordering for patch

+1 :green_heart:
mvninstall
2m 58s

the patch passed

+1 :green_heart:
compile
6m 49s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javac
6m 49s

the patch passed

+1 :green_heart:
compile
6m 54s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
javac
6m 54s

the patch passed

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

-0 :warning:
checkstyle
1m 19s
/results-checkstyle-hadoop-hdfs-project.txt
hadoop-hdfs-project: The patch generated 2 new + 33 unchanged - 0 fixed = 35 total (was 33)

+1 :green_heart:
mvnsite
3m 38s

the patch passed

+1 :green_heart:
javadoc
2m 28s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 16s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
8m  0s

the patch passed

+1 :green_heart:
shadedclient
21m  7s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

+1 :green_heart:
unit
2m 30s

hadoop-hdfs-client in the patch passed.

-1 :x:
unit
315m 34s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch passed.

+1 :green_heart:
unit
23m 33s

hadoop-hdfs-rbf in the patch passed.

+1 :green_heart:
asflicense
1m 10s

The patch does not generate ASF License warnings.

506m  5s

Reason
Tests

Failed junit tests
hadoop.hdfs.TestLeaseRecovery2

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/3/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux<PHONE_NUMBER>d9 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 4eda67027b83a5ebb3cddc2be0cbe08435268b45

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/3/testReport/

Max. process+thread count
3352 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/3/console

versions
git=2.25.1 maven=3.6.3 spotbugs=4.2.2

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.

:broken_heart: -1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 40s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s

No case conflicting files found.

+0 :ok:
codespell
0m  1s

codespell was not available.

+0 :ok:
detsecrets
0m  1s

detect-secrets was not available.

+0 :ok:
xmllint
0m  1s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
20m 10s

Maven dependency ordering for branch

+1 :green_heart:
mvninstall
27m 32s

trunk passed

+1 :green_heart:
compile
7m 23s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
compile
7m  6s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
checkstyle
1m 35s

trunk passed

+1 :green_heart:
mvnsite
4m  8s

trunk passed

+1 :green_heart:
javadoc
3m 11s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 46s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
8m 15s

trunk passed

+1 :green_heart:
shadedclient
21m 15s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 32s

Maven dependency ordering for patch

+1 :green_heart:
mvninstall
3m 11s

the patch passed

+1 :green_heart:
compile
7m 17s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javac
7m 17s

the patch passed

+1 :green_heart:
compile
6m 46s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
javac
6m 46s

the patch passed

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

-0 :warning:
checkstyle
1m 17s
/results-checkstyle-hadoop-hdfs-project.txt
hadoop-hdfs-project: The patch generated 2 new + 33 unchanged - 0 fixed = 35 total (was 33)

+1 :green_heart:
mvnsite
3m 17s

the patch passed

+1 :green_heart:
javadoc
2m 23s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m  9s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 52s

the patch passed

+1 :green_heart:
shadedclient
21m  9s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

+1 :green_heart:
unit
2m 41s

hadoop-hdfs-client in the patch passed.

-1 :x:
unit
304m 38s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch passed.

+1 :green_heart:
unit
34m 39s

hadoop-hdfs-rbf in the patch passed.

+1 :green_heart:
asflicense
1m 13s

The patch does not generate ASF License warnings.

507m 54s

Reason
Tests

Failed junit tests
hadoop.hdfs.TestLeaseRecovery2

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/4/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux 15a18a4df778 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 4eda67027b83a5ebb3cddc2be0cbe08435268b45

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/4/testReport/

Max. process+thread count
3309 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/4/console

versions
git=2.25.1 maven=3.6.3 spotbugs=4.2.2

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.

:broken_heart: -1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 39s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s

No case conflicting files found.

+0 :ok:
codespell
0m  1s

codespell was not available.

+0 :ok:
detsecrets
0m  1s

detect-secrets was not available.

+0 :ok:
xmllint
0m  1s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
15m 57s

Maven dependency ordering for branch

+1 :green_heart:
mvninstall
26m  6s

trunk passed

+1 :green_heart:
compile
6m 15s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
compile
5m 54s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
checkstyle
1m 24s

trunk passed

+1 :green_heart:
mvnsite
3m 47s

trunk passed

+1 :green_heart:
javadoc
3m  0s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 41s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 38s

trunk passed

+1 :green_heart:
shadedclient
21m  1s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 32s

Maven dependency ordering for patch

+1 :green_heart:
mvninstall
2m 54s

the patch passed

+1 :green_heart:
compile
6m  0s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javac
6m  0s

the patch passed

+1 :green_heart:
compile
5m 44s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
javac
5m 44s

the patch passed

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

-0 :warning:
checkstyle
1m 14s
/results-checkstyle-hadoop-hdfs-project.txt
hadoop-hdfs-project: The patch generated 1 new + 33 unchanged - 0 fixed = 34 total (was 33)

+1 :green_heart:
mvnsite
3m  5s

the patch passed

+1 :green_heart:
javadoc
2m 10s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m  5s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 31s

the patch passed

+1 :green_heart:
shadedclient
20m 51s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

+1 :green_heart:
unit
2m 41s

hadoop-hdfs-client in the patch passed.

-1 :x:
unit
306m 17s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch passed.

+1 :green_heart:
unit
23m  5s

hadoop-hdfs-rbf in the patch passed.

+1 :green_heart:
asflicense
1m 18s

The patch does not generate ASF License warnings.

484m 37s

Reason
Tests

Failed junit tests
hadoop.hdfs.TestLeaseRecovery2

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/6/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux 164b9b4c8623 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 994ab6244a07a00d30ad1903c64d576d4ae0a379

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/6/testReport/

Max. process+thread count
2927 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/6/console

versions
git=2.25.1 maven=3.6.3 spotbugs=4.2.2

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.

:broken_heart: -1 overall

Vote
Subsystem
Runtime
Logfile
Comment

+0 :ok:
reexec
0m 42s

Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s

No case conflicting files found.

+0 :ok:
codespell
0m  0s

codespell was not available.

+0 :ok:
detsecrets
0m  0s

detect-secrets was not available.

+0 :ok:
xmllint
0m  0s

xmllint was not available.

+1 :green_heart:
@author
0m  0s

The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s

The patch appears to include 2 new or modified test files.

_ trunk Compile Tests _

+0 :ok:
mvndep
15m 54s

Maven dependency ordering for branch

+1 :green_heart:
mvninstall
26m 11s

trunk passed

+1 :green_heart:
compile
6m 21s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
compile
6m  5s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
checkstyle
1m 28s

trunk passed

+1 :green_heart:
mvnsite
3m 57s

trunk passed

+1 :green_heart:
javadoc
3m  1s

trunk passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 40s

trunk passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 39s

trunk passed

+1 :green_heart:
shadedclient
21m 13s

branch has no errors when building and testing our client artifacts.

_ Patch Compile Tests _

+0 :ok:
mvndep
0m 28s

Maven dependency ordering for patch

+1 :green_heart:
mvninstall
2m 54s

the patch passed

+1 :green_heart:
compile
6m  4s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javac
6m  4s

the patch passed

+1 :green_heart:
compile
5m 51s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
javac
5m 51s

the patch passed

+1 :green_heart:
blanks
0m  0s

The patch has no blanks issues.

+1 :green_heart:
checkstyle
1m 12s

the patch passed

+1 :green_heart:
mvnsite
3m 17s

the patch passed

+1 :green_heart:
javadoc
2m 11s

the patch passed with JDK Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04

+1 :green_heart:
javadoc
3m 15s

the patch passed with JDK Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

+1 :green_heart:
spotbugs
7m 30s

the patch passed

+1 :green_heart:
shadedclient
21m  9s

patch has no errors when building and testing our client artifacts.

_ Other Tests _

+1 :green_heart:
unit
2m 33s

hadoop-hdfs-client in the patch passed.

-1 :x:
unit
301m 28s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt
hadoop-hdfs in the patch passed.

-1 :x:
unit
23m  4s
/patch-unit-hadoop-hdfs-project_hadoop-hdfs-rbf.txt
hadoop-hdfs-rbf in the patch passed.

+1 :green_heart:
asflicense
1m  4s

The patch does not generate ASF License warnings.

481m  4s

Reason
Tests

Failed junit tests
hadoop.hdfs.TestLeaseRecovery2

hadoop.hdfs.server.balancer.TestBalancerService

hadoop.hdfs.server.federation.router.TestRouterRPCMultipleDestinationMountTableResolver

Subsystem
Report/Notes

Docker
ClientAPI=1.41 ServerAPI=1.41 base: https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/7/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/5142

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets xmllint

uname
Linux a9b06287bb2f 4.15.0-191-generic #202-Ubuntu SMP Thu Aug 4 01:49:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
dev-support/bin/hadoop.sh

git revision
trunk / 4d19c5165dcc663bbbecc579a36768790e632baa

Default Java
Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Multi-JDK versions
/usr/lib/jvm/java-11-openjdk-amd64:Ubuntu-11.0.16+8-post-Ubuntu-0ubuntu120.04 /usr/lib/jvm/java-8-openjdk-amd64:Private Build-1.8.0_342-8u342-b07-0ubuntu1~20.04-b07

Test Results
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/7/testReport/

Max. process+thread count
2965 (vs. ulimit of 5500)

modules
C: hadoop-hdfs-project/hadoop-hdfs-client hadoop-hdfs-project/hadoop-hdfs hadoop-hdfs-project/hadoop-hdfs-rbf U: hadoop-hdfs-project

Console output
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-5142/7/console

versions
git=2.25.1 maven=3.6.3 spotbugs=4.2.2

Powered by
Apache Yetus 0.14.0 https://yetus.apache.org

This message was automatically generated.


Introducing the Exception deriving (rebased)

Superseeds #85

finally merged! thank you so much for your dedication @gquemener

:champagne: :tada: :fireworks:
You're very welcome, I had much fun working on it as well ^^
:+1:


Enforce role name uniqueness and add Delegations key helpers

Fixes #1426, #1469
Description of the changes being introduced by the pull request:
This pr contains three types of changes:
Enforce Delegation role name uniqueness
The spec does not say anything about role name uniqueness in a
delegations object, but I believe we cannot safely allow multiple roles
with the same role name in the roles array of a delegations object.
If we did then the roles could have different keyids, and then we would
end up in a situation where metadata may be both a valid delegation
and an invalid delegation at the same time, depending on how the role
gets chosen and that does not seem like the intention of the design.
There is an issue open in the specification with number 167 about
that issue.
Regardless of the Metadata API, I think we should enforce role name
uniqueness.
I chose to change the data structure containing roles to
OrderedDict, where keys are role names and values, are DelegatedRole
instances, because role names are the unique identifier of a role and
their order is important to the way they are traversed afterward.
Add missing key helpers in Delegations
Root class has the functionality to add and remove keys for delegated
metadata (add_key()/remove_key()) but the other delegator Targets does
not.
It should provide the same/similar functionality.
It seems logical to me that those functions will be part of the
"Delegations" class instead of "Targets" as those helper functions are
related to delegated roles.
Some cleaning

Moves a couple of Delegations serialization tests inside test_metadata_serialization.py
Removed some unused imports.

Please verify and check that the pull request fulfills the following
requirements:

[ ] The code follows the Code Style Guidelines
[ ] Tests have been added for the bug fix or new feature
[ ] Docs have been added for the bug fix or new feature

Inspired by #1553 commit "tests: Improve add_key/remove_key API tests" I added additional commit testing
the same thing as this commit does.

Then, if the key helper functions are used in Targets, then at least shouldn't we use more clarifying names for them?
If you call Targets.add_key() then where are we adding this key? Yes, there is function documentation, but wonder if
names like add_delegated_key() and remove_delegated_key() (which are both a lot longer :( ) will be better?

I don't think Targets.add_key() is a bad name. If the reader is confused about delegators and delegated roles we likely aren't going to fix that with function names: they could misread your suggestion the same way "oh Targets.add_delegated_key()! this is the function I use to add the key that delegates from root to targets"

I can't say I am a fan of as a function name, but it seems there is no better option. I thought this name could be misleading for Targets compared to Root because in Root there is a top-level keyids dictionary and IMO this makes it clearer.
Will move the add_key API call to Targets.

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

16 of 16 (100.0%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.01%) to 96.418%

Totals

Change from base Build<PHONE_NUMBER>:
0.01%

Covered Lines:
3882

Relevant Lines:
3994

💛  - Coveralls

I rebased on top of develop and had to resolve a couple of conflicts.
Additional changes I made are:

moved the add_key and remove_key functions to Targets
added a check if delegations is None reminded by mypy that that is a possible case when calling the key helpers
created a new test function test_targets_key_api because the use cases became a lot

I was wondering what should we do if somebody calls targets.add_key() or targets.remove_key() and delegations is None.
It seemed logical to me that we can just ignore such calls.
What do the other think?

We shouldn't silently ignore failures. I think an exception should be raised here. exceptions.py defines UnknownRoleError (as well as RoleAlreadyExistsError for the uniqueness check but a ValueError should be ok too).

Now as you said it makes sense to warn the user that nothing happened when calling add_key or remove_key.
Added a UnknownRole exception there.
Additionally, I swapped the ValueError exception with RoleAlreadyExistsError which seems more concrete for that case.

Additionally, I swapped the ValueError exception with RoleAlreadyExistsError which seems more concrete for that case.

I'm afraid someone may have a different opinion on this one :D @jku

I think in the future I'd suggest not combining issues like these two: If this had been two separate PRs it would have meant a bit more work for you (to rebase the second PR and to figure out when to put the second PR to review) but it would have meant reviewers need less context, can do faster reviews and the first PR would land faster.

I think in the future I'd suggest not combining issues like these two: If this had been two separate PRs it would have meant a bit more work for you (to rebase the second PR and to figure out when to put the second PR to review) but it would have meant reviewers need less context, can do faster reviews and the first PR would land faster.

Yes, I guess you are right. I thought I can combine fixing those two issues and that you will have the context given that
you suggested that here https://github.com/theupdateframework/python-tuf/issues/1469#issuecomment-871271393 and both of the issues are submitted by you.

If you can rebase as well that would be great (the workflow jobs changed name and branch protection will now think you haven't passed the tests)

I think this is a correct change, thanks.
Commit messages do not make clear that the Delegations API has a breaking change, we should get better at this as we can't expect the release notes writer to always make the connection... Anyway LGTM: we can mention API change in the merge commit maybe?

Now it should be clearer and I am not sure what will be the value in adding a note about the API changes anymore.


'datetime' field doesn't accept dates that has minutes, hours, seconds. Only '00:00:00' value allowed.

Reopening https://github.com/marmelab/ng-admin/issues/854
2015-12-15 00:00:00 - accepted
2015-12-15 11:00:00 - not allowed (invalid form)

Duplicate of #854


Fix locking in ssl_cert_dup()

Properly check the return value of CRYPTO_THREAD_lock_new()

+1

+1.  merging now.


🐛 Fix DD node leak

Description
Fixes #384
Checklist:

[x] The pull request only contains commits that are related to it.
[x] I have added appropriate tests and documentation.
[ ] I have made sure that all CI jobs on GitHub pass.
[ ] The pull request introduces no new warnings and follows the project's style guidelines.

clang-tidy install is currently failing due to https://github.com/llvm/llvm-project/issues/64120
Should resolve itself over time.


fix(@react-aria/overlays): prevent exception on Cypress

Cypress screenshot command triggers a scroll event where the event target is window, not a DOM element.
Closes #2340
✅ Pull Request Checklist:

[x] Included link to corresponding React Spectrum GitHub Issue.
[ ] Added/updated unit tests and storybook for this change (for new code or code which already has tests).
[ ] Filled out test instructions.
[ ] Updated documentation (if it already exists for this component).
[ ] Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:
Let me know if needed.

Good points @snowystinger
Pushed an update which adds two test cases. the first one covers the regression that happened first in this PR. the second one captures the fix for the cypress issue that this PR solves.


Feature/Member Reaction Endpoints

The primary goal of these changes is the implementation of new endpoints for Members and their Reactions, including the one allowing the frontend to POST members' reactions to the database. This is achieved by reorganizing the relationship in the database between Members and Reactions and adding the necessary repositories, services, and controllers. Along the way, a few related problems have been cleaned up, including changing how a Member's primary key is generated and changing how ClubActivities relate to the new MemberReaction model.
Adds new files:

ReactionRepository
ReactionService
ReactionServiceImpl
MemberRepository
MemberService
MemberServiceImpl
MemberController

Deletes one file: MemberReactionsId

added seed data for member/reaction/memberReaction


[Bug or Not?] Variable and VarHandleOp has different initial value in creating slots in ExponentialMovingAverage

System information

Have I written custom code (as opposed to using a stock example script provided in TensorFlow): No
OS Platform and Distribution (e.g., Linux Ubuntu 16.04): CentOS 7
Mobile device (e.g. iPhone 8, Pixel 2, Samsung Galaxy) if the issue happens on mobile device: None
TensorFlow installed from (source or binary): source
TensorFlow version (use command below):  master
Python version: 2.7
Bazel version (if compiling from source): 0.15.0
GCC/Compiler version (if compiling from source):  None
CUDA/cuDNN version: 7.0
GPU model and memory: None
Exact command to reproduce: None

Describe the problem
Variable and ResourceVariable has different initial value here. Is it a bug or expect action?
        # For variables: to lower communication bandwidth across devices we keep
        # the moving averages on the same device as the variables. For other
        # tensors, we rely on the existing device allocation mechanism.
        with ops.init_scope():
          if isinstance(var, variables.Variable):
            avg = slot_creator.create_slot(var,
                                           var.initialized_value(),
                                           self.name,
                                           colocate_with_primary=True)
            # NOTE(mrry): We only add `tf.Variable` objects to the
            # `MOVING_AVERAGE_VARIABLES` collection.
            ops.add_to_collection(ops.GraphKeys.MOVING_AVERAGE_VARIABLES, var)
          else:
            avg = slot_creator.create_zeros_slot(
                var,
                self.name,
                colocate_with_primary=(var.op.type in ["Variable",
                                                       "VariableV2",
                                                       "VarHandleOp"]))
            if self._zero_debias:
              zero_debias_true.add(avg)
        self._averages[var] = avg

Hi, @alextp
Sorry to bother you. This code seems have different initial value here. Is there any other consideration？
Thanks.

They will have different initial values if they are randomly initialized. TF requires you to specify an op seed when creating a random initializer if you want determinism; otherwise any change in the graph structure can change the internal seed used for the initializer leading to different values.

Sorry，let me clarify this question. I mean why using create_slot in Variable branch but using create_zero_slot in VarHandleOp branch？

@alextp I am afraid that you mis-understand our questions. What siyu tried to point out here is that for the same Variable stuff(in the if branch it is a normal Variable op, while in the else branch it is a ResourceVariableOp), in our understanding, either Variable op or ResourceVariable op should  have the same initialization value, otherwise ,that is a inconsistency. Could please kindly take a further look at our questions before closing it?
Thanks

Both ResourceVariable and RefVariable inherit from variables.Variable so they should both go through the initialized value mechanism.
Only a non-variable Tensor will trigger the zeros case.

Thank you.

@alextp Actually DistributedValues such as MirroredVariable will trigger the zeros case, is that as expected?

Why treats Variables and Non-Variables different? Are they equivalent in mathematical ?

Variables are not a mathematical concept, so there's no mathematical justification for the difference. I don't know why this was implemented this way. I don't expect it to ever matter since it's an exponential moving average which is very independent of the initial value if you update it more than a few times.
We should probably make MirroredVariable and friends inherit from ResourceVariable not just for this, though. Please file an issue.

I see. Thanks for your answer


Pagination in form dashboard

Issue: 97
Short description of what this resolves:
Changes proposed in this pull request and/or Screenshots of changes:

@BuddyLongLegs Please review now


Naming conventions

Hey all, when @sofer and I were cleaning up the FAC repositories earlier this month, we tried to standardize naming conventions using dwyl's example.
It's a small things, but would you mind renaming SocialUp as social-up? Apologies if you are already aware of the convention but decided to use caps on purpose!

Yes, sure no problem! We weren't aware of this naming convention.


info command doesn't give the version information anymore

Since #3531 the information command doesn't report versions anymore as reported in #3532
Couple of changes required:

let's change the display to be a table for clarity
let's include the install command with an example for abstractions after the table.

authored #3894


Add audit location support

Closes #260
Confirmed working by converting an XLSForm to XML and running it in Collect v1.9.0.
The build that is broken is due to a deprecation warning. I've sent in a PR to fix this at https://github.com/XLSForm/pyxform/pull/261.

I would love to get this merged and out by the Collect v1.20 code freeze on Feb 20th. Let me know if there is anything I can do to facilitate that, @ukanga!

@yanokwa It is quite possible to do a release before then, any chance you can rebase and potentially consider https://github.com/XLSForm/pyxform/pull/260/files#r257358559? I will revisit this for merging this Sunday when I plan to do a release.

Thanks for the review, @ukanga! I've made the changes you requested.

Merged, but we wait until Validate v1.11 before we release


Override Prometheus exporter config XML via a user-supplied ConfigMap

Allow users to override the Prometheus exporter config (XML) via a user-provided ConfigMap supplied via the existing prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap setting.
Keep the md5 hash of the custom config XML in an annotation on the pod spec of the deployment so that a rolling restart is triggered when the configuration changes.

Still need an explicit unit test for the user-provided config before this one is ready to merge.

Still need an explicit unit test for the user-provided config before this one is ready to merge.


Handle kill shim while container is paused

kill shim will send SIGKILL to its children, but
if the container is paused, the container doesn't
response to the signal, this cause the containerd
block and fail to start next time.
Signed-off-by: Lei Jitang<EMAIL_ADDRESS>

This is for v0.2.x branch

Do you think a test could be added for this case?

@mlaventure  added a test
Before this patch
[root@fedora lei]# ctr containers
ID                  PATH                                 STATUS              PROCESSES
busybox1            /home/lei/container_rootfs/busybox   running             init
[root@fedora lei]# ctr containers pause busybox1
[root@fedora lei]# ps aux | grep shim
root     27774  0.0  0.0 416736  2868 pts/5    Sl   02:54   0:00 containerd-shim busybox1 /home/lei/container_rootfs/busybox runc
root     27851  0.0  0.0 118928  2248 pts/8    S+   02:54   0:00 grep --color=auto shim
root     31721  0.0  0.2<PHONE_NUMBER>0 ?


Hey, a Question

I kinda used your mod as a basis for
https://github.com/Smartin-b/art_of_forging
a fork that would allow Tetra to work with Better Combat
Hope thats okay as you are under the MiT license,
otherwise i would have write custom net and config code _

This is fine as long as you follow the license. This is the only real limitation of the license
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.


Compile even if not all cases are handled

These enums are likely to get out of sync with ffmpeg_sys, so some flexibility may be useful.

I don't know how I feel about this, I'd rather fix the missing cases when ffmpeg-sys upgrades, are any failing currently?

Maybe changing ffmpeg-sys dependency from ffmpeg-sys="3.3" to ffmpeg-sys="~3.3" would be enough? Then it woulldn't pull newer versions of ffmpeg-sys than 3.3.X. With current requirement it can pull every version <4.0.0

Admittedly that's a bit lazy solution, but the Rust wrapper currently does fail to compile because ffmpeg-sys has expanded these enums.
I'm unable to find any version of ffmpeg-sys that compiles with the current master. I guess it's using bindgen, and in that case it's not possible go guarantee 1:1 match in these enums (if you add missing items to the enums, they will fail to compile with FFI from an older version of C headers).

Can you merge it, and perhaps remove the cases later if you find a solution to lock sys to a specific ffmpeg version?

Bindgen authors in 0.3 version changed how enums are generated (https://github.com/rust-lang-nursery/rust-bindgen/issues/758). By default instead of enums bindgen now generated constants. rust-ffmpeg-sys overrides this here: https://github.com/meh/rust-ffmpeg-sys/blob/master/build.rs#L918 Maybe we should drop this and rewrite rust-ffmpeg to use constants, but that would loose compiler check for exhaustiveness.


Update sbt-microsites to 1.4.0

Updates com.47deg:sbt-microsites from 1.3.4 to 1.4.0.
GitHub Release Notes - Version Diff
I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.
If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.
Configure Scala Steward for your repository with a .scala-steward.conf file.
Have a fantastic day writing Scala!

Files still referring to the old version number
The following files still refer to the old version number (1.3.4).
You might want to review and update them manually.
examples/todo-spray/build.sbt

Adjust future updates
Add this to your .scala-steward.conf file to ignore future updates of this dependency:
updates.ignore = [ { groupId = "com.47deg", artifactId = "sbt-microsites" } ]

Or, add this to slow down future updates of this dependency:
dependencyOverrides = [{
  pullRequests = { frequency = "@monthly" },
  dependency = { groupId = "com.47deg", artifactId = "sbt-microsites" }
}]

labels: sbt-plugin-update, early-semver-minor, semver-spec-minor, old-version-remains, commit-count:1

Superseded by #2071.


Off-cluster Minio

Please how do I use my existing minio instance off cluster, as I am running locally, and do not want to use Amazon S3. I understand the API is compatible and Deis is alreadying using minio internally. I just want to use an off-cluster instance of Minio.
I have already ran
helm inspect values deis/workflow | sed -n '1!p' > values.yaml
and configured the credentials under s3, but it seems that there is no way to configure the host/url.
Thanks

currently there is no way to do this, however PRs would be accepted to get this working.

currently there is no way to do this, however PRs would be accepted to get this working.

I have limited experience with Go, but can you point me to a relevant place to get started?

I have limited experience with Go, but can you point me to a relevant place to get started?

You'll want to modify the workflow umbrella chart, which is not written in Go. After that, you'll want to make changes to the builder, the registry and to the database. Two of them are bootstrapped by a Go wrapper, and a git grep STORAGE_TYPE will get you where you need to be in the codebase.
Some links to help you get started:
source code: https://github.com/deis/workflow/tree/master/charts/workflow
blog post on the umbrella chart: https://deis.com/blog/2017/workflow-chart-assembly/
docs on Helm charts: https://github.com/kubernetes/helm/blob/master/docs/charts.md
https://github.com/deis/builder
https://github.com/deis/registry
https://github.com/deis/postgres

closing as a dupe of https://github.com/deis/workflow/issues/481


Proposal: Pre/PostBundle() Plugin Lifecycle Hooks

Requested from issue #31
Changes

Adds preBundle() and postBundle() plugin hooks
Adds very basic BannerPlugin

Notes
I'm not sure if postBundle()is very useful. Originally my hope was to maybe use this hook for minification of the entire bundle, but I don't think thats possible. Happy to remove if it adds no value - let me know.

Good stuff!


There is no get_tokeninfo_url function in security module

Description
There is no get_tokeninfo_url function in security module.
>>> from connexion import operation
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mkupidura/.virtualenvs/req-up/lib/python3.7/site-packages/connexion/operation.py", line 11, in <module>
    from .decorators.security import (get_tokeninfo_func, get_tokeninfo_url,
ImportError: cannot import name 'get_tokeninfo_url' from 'connexion.decorators.security' (/Users/mkupidura/.virtualenvs/req-up/lib/python3.7/site-packages/connexion/decorators/security.py)

Looking at the security.get_tokeninfo_func doc-string it might be some refactoring left-overs
def get_tokeninfo_func(security_definition):
    """
    :type security_definition: dict
    :rtype: function

    >>> get_tokeninfo_url({'x-tokenInfoFunc': 'foo.bar'})
    '<function foo.bar>'
    """
    # ...

Additional info:
Output of the commands:

Python 3.7.0
Version: 2.0.0

Hi @fwkz - can you make sure you clean out all of your .pyc files?
The operation class was split out into two distinct classes to support swagger 2.x and openapi 3.x.x simultaneously, so you cannot from connexion import operation anymore.
from connexion.operations import (SecureOperation, Swagger2Operation, OpenAPIOperation) should work though.
If you can say more about what you're trying to do, I might be able to help more.

Hi @dtkav -
I am also having the same issue as @fwkz
I re-cloned my repo that I am working on today and re pip installed all of my requirements.
I am getting this stack trace
  File "/home/natalie/code/eeg-web-interface/applications/modules/eegcloud_apis/eegcloud_apis/applications/modules/connexion_utils.py", line 12, in <module>
    from connexion.operation import security_passthrough
  File "/home/natalie/code/eeg-web-interface/venv/local/lib/python2.7/site-packages/connexion/operation.py", line 11, in <module>
    from .decorators.security import (get_tokeninfo_func, get_tokeninfo_url,
ImportError: cannot import name get_tokeninfo_url

The issue starts in my code where I call this:
from connexion.operation import security_passthrough

I took a look at operation.py and found this code at line 11
from .decorators.security import (get_tokeninfo_func, get_tokeninfo_url,
                                  security_passthrough, verify_oauth_local,
                                  verify_oauth_remote)

and yet, when I go to .decorators.security I see this:
def get_tokeninfo_func(security_definition):
    """
    :type security_definition: dict
    :rtype: function

    >>> get_tokeninfo_url({'x-tokenInfoFunc': 'foo.bar'})
    '<function foo.bar>'
    """
    token_info_func = (security_definition.get("x-tokenInfoFunc") or
                       os.environ.get('TOKENINFO_FUNC'))
    if token_info_func:
        return get_function_from_name(token_info_func)

    token_info_url = (security_definition.get('x-tokenInfoUrl') or
                      os.environ.get('TOKENINFO_URL'))
    if token_info_url:
        return functools.partial(get_tokeninfo_remote, token_info_url)

    return None

def get_scope_validate_func(security_definition):
    """
    :type security_definition: dict
    :rtype: function

    >>> get_scope_validate_func({'x-scopeValidateFunc': 'foo.bar'})
    '<function foo.bar>'
    """
    func = (security_definition.get("x-scopeValidateFunc") or
            os.environ.get('SCOPEVALIDATE_FUNC'))
    if func:
        return get_function_from_name(func)
    return validate_scope

I then went over to my coworker who did not re pip install her requirements yet today, and saw this code in .decorators.security:
def get_tokeninfo_func(security_definition):
    """
    :type security_definition: dict
    :rtype: function

    >>> get_tokeninfo_url({'x-tokenInfoFunc': 'foo.bar>'})
    '<function foo.bar>'
    """
    token_info_func = (security_definition.get("x-tokenInfoFunc") or
                       os.environ.get('TOKENINFO_FUNC'))
    return get_function_from_name(token_info_func) if token_info_func else None

def get_tokeninfo_url(security_definition):
    """
    :type security_definition: dict
    :rtype: str

    >>> get_tokeninfo_url({'x-tokenInfoUrl': 'foo'})
    'foo'
    """
    token_info_url = (security_definition.get('x-tokenInfoUrl') or
                      os.environ.get('TOKENINFO_URL'))
    return token_info_url

def security_passthrough(function):
    """
    :type function: types.FunctionType
    :rtype: types.FunctionType
    """
    return function

def get_authorization_token(request):
    authorization = request.headers.get('Authorization')  # type: str
    if not authorization:
        logger.info("... No auth provided. Aborting with 401.")
        raise OAuthProblem(description='No authorization token provided')
    else:
        try:
            _, token = authorization.split()  # type: str, str
        except ValueError:
            raise OAuthProblem(description='Invalid authorization header')
    return token

so clearly there is a discrepancy here. the operation.py file is expecting a method called get_token_url to exist in .decorators.security.py and yet it doesn't exist. it did, however, exist yesterday. So that is a little worrisome
Let me know if this is a bug or if I am doing something incorrectly.

Hi @nabrowning - operation.py no longer exists, so cannot be imported. This was intended to be backwards compatible, but it must have gotten lost somewhere along the way.
Here's what happens when I try to import connexion.operation (and why I think you may have a .pyc file somewhere):
(venv) connexion/connexion content_type_validation > ipython
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from connexion.operation import security_passthrough
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-7b0f5d377fd6> in <module>()
----> 1 from connexion.operation import security_passthrough

ModuleNotFoundError: No module named 'connexion.operation'

And here's me importing security_passthrough from its new home in 2.0:
In [2]: from connexion.operations.secure import security_passthrough

In [3]: security_passthrough
Out[3]: <function connexion.decorators.security.security_passthrough(function)>

Connexion 2.0 has some backwards-incompatible changes, so you have two options:

Pin your connexion to 1.5.3
Update your code to use Connexion 2.0 like this:

from connexion.operations.secure import security_passthrough

I'll also put up a PR to make connexion.operation into a dummy module that links to * from secure, swagger2, so hopefully this won't be a surprise to future folks in 2.0.2
Let me know if either of those options work for you.

Brand new virtualenv seems to have operation module 🤔
~/.virtualenvs/conn/lib/python3.6/site-packages/connexion $ ls -la | grep operation
-rw-r--r--   1 fwkz  staff  19198  7 lis 23:51 operation.py
drwxr-xr-x   8 fwkz  staff    256  7 lis 23:51 operations

@fwkz you're right! That's spooky! :ghost:
My guess is that the build/release process doesn't clean up deleted files properly.
That file is definitely not tracked in git.
@jmcs any ideas what happened?

@fwkz the next release of connexion (2.0.2) will include a proxy operation class for backwards compatibility. If you like, you can try it out by installing from a commit on master:
pip install git+git://github.com/zalando/connexion.git@343643428cf68b9c4bfba21fe3df162170c68b48

@dtkav Really appreciate the effort. 🤗


<SimpleBar> should have a minimum apparent value

If a <SimpleBar> has a value of 0, its width is 0 and ends up invisible. Similarly, if its value is very small. It'd be good to give it a minimum width — maybe double its border radius, 8px?
So instead of:

and

It would look like:

and

Resolved by #276.


feat(monitoring): generate async version of CreateTimeSeries()

At least one team is interested in using the asynchronous version of
this RPC.

This change is

/cc: @yulanw


CHEBI:131712 - shinorine

Dear curators,
The molecular formula reported for shinorine is wrong. The one corresponding to the described structure should be C13H20N2O8 (see for example ttps://pubchem.ncbi.nlm.nih.gov/compound/10471931).
Cheers,
Gabriel Markov

This has now been corrected. Thanks for letting us know.


Barchart issues

Barchart scores are displayed under the progress bar, should be displayed inline
On https://www.bitdefender.com.au/solutions/

On https://main--bitdefender--hlxsites.hlx.page/solutions/

On tablet when two barcharts are displayed, they should be displayed one near another, on the same line
On bitdefender website https://www.bitdefender.com.au/solutions/

On Franklin version https://main--bitdefender--hlxsites.hlx.page/solutions/

(Checked on a display with width 820px - iPad Air)
Icon displayed on the barchart should be bigger. On bitdefender website the size is 46px or 2.875rem
On the Franklin version the size is 34px
.barchart.block h3 should have a smaller margin of 7px or 04375rem
font size of the antivirus names is smaller, on bitdefender website is 14px on all devices. I would suggest to make it 14px (--body-font-size-xs) on mobile and --body-font-size-s on other devices, what do you think?
On mobile there is a space between the icon and the barchart title, seems to be because of the gap used to have a spacing between the icon and the rest of the barchart component. On bitdefender website there is no gap.

use grid display style for the bar charts


Add --simple flag to gto register

close #233

Codecov Report
Base: 80.91% // Head: 80.25% // Decreases project coverage by -0.65% :warning:

Coverage data is based on head (6194c34) compared to base (691ca4b).
Patch coverage: 100.00% of modified lines in pull request are covered.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #237      +/-   ##
==========================================
- Coverage   80.91%   80.25%   -0.66%
==========================================
  Files          16       16
  Lines        1886     1849      -37
==========================================
- Hits         1526     1484      -42
- Misses        360      365       +5

Impacted Files
Coverage Δ

gto/config.py
95.65% <ø> (-0.14%)
:arrow_down:

gto/cli.py
69.46% <100.00%> (-0.11%)
:arrow_down:

gto/_version.py
36.36% <0.00%> (-45.46%)
:arrow_down:

gto/base.py
84.35% <0.00%> (-1.04%)
:arrow_down:

gto/ext.py
71.05% <0.00%> (-0.75%)
:arrow_down:

gto/ui.py
83.01% <0.00%> (-0.62%)
:arrow_down:

gto/versions.py
88.33% <0.00%> (-0.56%)
:arrow_down:

gto/registry.py
73.04% <0.00%> (-0.24%)
:arrow_down:

... and 1 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


Test/validate calculations for Budgets, Expenses & Payments

Describe the task
This ticket has been repurposed to shift the focus from usability testing towards validating the calculations under the forms below using 1. different scenarios from the Calculations document as well as the 2. real data from CIF team's current tracking spreadsheets.

Budgets, Expenses & Payments
Milestone Reports
Emissions Intensity Reports

Acceptance Criteria

[x] For each scenario, enter the manual data into TEST following the reference document
[x] Confirm if the auto calculated/populated data is the same as the reference document
[x] Enter the manual data into TEST following the tracking spreadsheets
[ ] Confirm if the auto calculated/populated data is the same as the tracking spreadsheets
[x] Document and sync up the findings with the team and create follow-up tickets if necessary

Additional context

waiting on #656 to be implemented

Hi @nanyangpro @suhafa @pbastia - following up on this ticket. The last comment above, indicates that this ticket is blocked by the implementation of ticket #656; however, that ticket is back in the backlog pipeline. During sprint planning, should we pull this ticket back into the backlog and re-prioritize #656 to be completed next sprint? What are your thoughts.

Thanks for your question, @LindsayMacfarlane - I'd love to see it. I believe the office hour with Taylor this afternoon will be utilized by Mike to address the remaining questions for #656.
Other features for Budgets, Expenses, & Payments have been tested during our post release observation sessions FYI.

Hi @nanyangpro - is this ticket still required?

Thanks for confirming, @LindsayMacfarlane. - Yes, we haven't conduct any user tests for Budgets, Expenses & Payments in TEST. I'd suggest doing them once the calculations are in place.

Updates for @LindsayMacfarlane:

2 different scenarios and a special case have been tested in TEST, referring to the Calculations doc
Real data of a project was provided by CIF has been tested in TEST
Overall the implementation is mostly accurate except for the few mistakes/defects identified. Please see test outcome details here.
Tickets required for corrections will be created by EOD. I'll pin you with the ticket number as soon as it's done. :)
An observation session has been scheduled with Lindsay to enter real project data. (Being mindful of the holiday and flex day, it's currently scheduled next Thursday in the morning.)

Hi @LindsayMacfarlane - This ticket is ready for you to review and can be closed with:

All the test results, findings, and reasoning for next steps documented in Miro.
For the CIF app

#1472 created

For the Budgets, Expenses & Payments page

#1448 created, re-tested, and closed with reasoning in its comments

For the Milestone Reports page

#1471 created in Icebox as discussed with you
#1480 created as confirmed with Amanda, and labeled as high-priority

For the Emissions Intensity Report page

#1442 created, implemented, and currently accepted by PO/Dev
#1466 created and closed (will be handled as part of #1437)
#1478 created as confirmed with Amanda, and labeled as high-priority

Thank you for attending the observation sessions, your input and notes helped a lot.

Thank you @nanyangpro! It was absolutely fascinating getting to sit in and observe both how the CIF team is entering data into the system and confirming that the calculations worked (or didn't). A lot of really great insight was gathered during these sessions.